当前位置: 首页 > 面试题库 >

MySQL如何填充范围内的缺失日期?

东郭鸿福
2023-03-14
问题内容

我有一个包含2列的表格,日期和分数。它最多有30个条目,最近30天内每个条目一个。

date      score
-----------------
1.8.2010  19
2.8.2010  21
4.8.2010  14
7.8.2010  10
10.8.2010 14

我的问题是缺少某些日期-我想看看:

date      score
-----------------
1.8.2010  19
2.8.2010  21
3.8.2010  0
4.8.2010  14
5.8.2010  0
6.8.2010  0
7.8.2010  10
...

我从单个查询中需要得到的是:19,21,9,14,0,0,10,0,0,14 …这意味着缺失的日期填充有0。

我知道如何获取所有值,以及如何使用服务器端语言遍历日期和缺少空格。但这是否可以在mysql中完成,所以我可以按日期对结果进行排序并得到缺失的片段。

编辑:在此表中还有另一个名为UserID的列,所以我有30.000用户,其中一些在此表中具有得分。如果日期<30天前,我会每天删除日期,因为我需要为每个用户提供最近30天的分数。原因是我正在绘制过去30天的用户活动图,并绘制图表,我需要用逗号分隔的30个值。因此,我可以说在查询中获得USERID
= 10203活动,查询将获得30分,最近30天中的每一分。我希望我现在更加清楚。


问题答案:

MySQL没有递归功能,因此您可以使用NUMBERS表技巧-

  1. 创建一个仅包含递增数字的表-使用auto_increment易于完成:

    DROP TABLE IF EXISTS `example`.`numbers`;
    

    CREATE TABLE example.numbers (
    id int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY (id)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  2. 使用以下命令填充表:

    INSERT INTO `example`.`numbers`
    

    ( id )
    VALUES
    ( NULL )

…根据需要提供尽可能多的值。

  1. 使用DATE_ADD构造日期列表,并根据NUMBERS.id值增加日期。将“ 2010-06-06”和“ 2010-06-14”分别替换为您的开始日期和结束日期(但使用相同的格式,YYYY-MM-DD)-

    SELECT `x`.*
    

    FROM (SELECT DATE_ADD(‘2010-06-06’, INTERVAL n.id - 1 DAY)
    FROM numbers n
    WHERE DATE_ADD(‘2010-06-06’, INTERVAL n.id -1 DAY) <= ‘2010-06-14’ ) x

  2. 根据时间部分将联接左移到数据表中:

       SELECT `x`.`ts` AS `timestamp`,
          COALESCE(`y`.`score`, 0) AS `cnt`
     FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%m/%d/%Y') AS `ts`
             FROM `numbers` `n`
            WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x
    

    LEFT JOIN TABLE y ON STR_TO_DATE(y.date, ‘%d.%m.%Y’) = x.ts

如果要维护日期格式,请使用DATE_FORMAT函数

DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`


 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : MySQL如何填充范围内的缺失日期? (5个答案) 2年前关闭。 我有这个查询,我想用一些值(例如零…)填充缺失的日期。 结果如下: 如何用零值填充缺失的日期?有人有主意吗? 我需要这些数据来进行 图表 预览。 问题答案: 通常,您可以使用以下方法在MySQL中生成一系列N个整数: 请注意,您联接的表(someTable)必须至少具有N行。 上面的-1是

  • 我有一个数据集,日期设置为每月的第一个。例如- 我需要加入这张桌子: 通常情况下,我会对这一条加一个权利- ...它工作良好,日期2021-02-01。那是在2021-01-30和2021-02-12之间。 类似地,2021-03-01日期介于2021-02-27和2021-03-12之间 然而!开始日期为2021-02-13、结束日期为2021-02-26的支付期间的值为空。我希望表A中二月份的

  • 问题内容: 是否有任何语法/软件包允许使用数字范围快速填充Java数组,例如在perl中? 例如 另外,这里提供了一个包,该包允许在上述数字列表中获取第n个数字,而无需实际创建数组(这可能很大)? 例如 实施起来并不太困难,但是我想这可能很普遍,所以也许已经完成了。 问题答案: 不像True Soft的答案那么干净,但是您可以使用Google Guava达到相同的效果: 请注意,您需要一些静态导入

  • 我有一个缺少“SNAP_ID”值的数据帧。我想根据前一个非缺失值(lag()?)的序列,用浮点值填充缺失值。如果可能的话,我真的想只用dplyr来实现这一点。 假设: 永远不会有丢失的数据,因为第一行或最后一行我根据数据集的最小值和最大值之间的缺失天数生成缺失的日期 数据集中可能存在多个空白 当前数据: 我想要实现的目标: 作为数据帧: 这是我实现这个目标的尝试,但它只适用于第一个缺失的值: 来自

  • 问题内容: 我有一张可以容纳一年中所有天/月的表 例如 我有一张表格,显示来自不同数据集的日期范围 例如 我如何比较这两个表以显示该特定月份的数据集中缺少哪些日期 对于上面示例中的数据集所在的示例,EG缺少日期范围01/09/2013-19/09/2013 谢谢你的帮助! 问题答案: 您可以使用CTE并通过以下方式编写查询:

  • 本文向大家介绍在指定范围内填充Java float数组中的元素,包括了在指定范围内填充Java float数组中的元素的使用技巧和注意事项,需要的朋友参考一下 可以使用java.util.Arrays.fill()方法将元素填充到指定范围内的Java float数组中。此方法将指定范围内所需的float值分配给Java中的float数组。 Arrays.fill()方法所需的参数是数组名称,要填充