【问题标题】:Joining missing dates from calendar table [duplicate]加入日历表中缺少的日期[重复]
【发布时间】:2018-05-02 14:27:44
【问题描述】:

我有一个包含信息和日期的表,其中有一些缺失,所以我想将该表与日历表连接起来,以填充缺失的日期并将同一行中另一列中的值设置为空。这是一个例子:

Steps | Date
 10   | 2018-04-30
 20   | 2018-04-28

它想要做以下事情:

Steps | Date
 10   | 2018-04-30
 null | 2018-04-29
 20   | 2018-04-28

这是我尝试过的(真正的查询,所以你可以指出我是否做错了什么):

SELECT sum(steps), date(from_unixtime(u.in_date)) as stepdate
    FROM userdata u
        RIGHT JOIN
    time_dimension td
    ON date(from_unixtime(u.in_date)) = td.db_date
    AND user_id = 8
    GROUP BY day(from_unixtime(in_date))
    ORDER BY stepdate DESC;

我希望这个查询能做我想做的事,但事实并非如此。表time_dimension 及其列db_date 包含所有日期(范围从2017-01-01 到2030-01-01),这是我尝试加入userdatain_date 列的日期(在 unix_time 中)。

编辑:我在 SO 中检查了以下问题:

编辑,关于重复:该问题特别是使用间隔和 date_add 与他们的表格进行比较。我正在使用日历表来加入他们。虽然相似,但我认为他们不会有相同的解决方案。

解决方案:感谢指出错误的xQBert:

问题:将 group by 放在 userdata 表和 select 上,您基本上忽略了时间维度数据。 Userdata 权限中没有 2018-4-29 日期(对于用户 8)修复 select & group by 以从时间维度数据中获取源并解决问题。

所以,我将GROUP BY day(from_unixtime(in_date)) 更改为GROUP BY td.db_date

【问题讨论】:

  • 我会先从日历表中选择,然后在日期字段上针对您的数据表进行 LEFT JOIN。
  • 问题:将 group by 放在 userdata 表和 select 上,你基本上忽略了时间维度数据。 Userdata 权限中没有 2018-4-29 日期(对于用户 8)修复 select & group by 以从时间维度数据和问题解决。注意:我怀疑您是否需要任何函数调用以在 select 和 group by 中对 td.db_date 进行转换,因为时间维度数据似乎已经采用 YYYY-MM-DD 格式。
  • GROUP BY 需要包含日历表中的日期字段,因为它包含所有键,不匹配时会汇总空值。
  • @Newbb:你怎么知道开始/结束的日期?提供身份证件的第一个和最后一个日期?通过外部加入 time_Dimension,您将获得该表中的所有日期。您需要限制用户日期的最小值/最大值吗?
  • 是的! @xQbert 的评论有答案。这完全超出了我的想象。如果您想添加它作为答案,我很乐意选择它作为答案。

标签: mysql sql join


【解决方案1】:

你需要left join 而不是right join 或者你也可以改变表格的位置

SELECT sum(steps), date(from_unixtime(td.db_date)) as stepdate
FROM time_dimension td  
LEFT JOIN userdata u
     ON date(from_unixtime(u.in_date)) = td.db_date 
WHERE user_id = 8
GROUP BY date(from_unixtime(td.db_date))
ORDER BY stepdate DESC;

但是,这假定time_dimension 表被视为日历表。

【讨论】:

  • @Rossbush 这就是 time_dimension 表的用途;它有一个范围内的所有日期。 (至少这是我从问题中得到的)“表 time_dimension 及其列 db_date 具有所有日期(范围从 2017-01-01 到 2030-01-01)”
  • 感谢您的快速答复!那也没有用;我得到了同样的结果。 Here's a screenshot of the result, if it helps
  • 问题是GROUP BY day(from_unixtime(in_date)) 的组应该是group by td.db_date。选择似乎也很奇怪......为什么需要在似乎已经是日期的文件上使用 date 和 from_unixtime 函数?如果不是,那么您在连接的 td.db_date 字段中缺少这些函数。
  • @YogeshSharma 我怀疑 select 和 group by 是否需要 date(from_unixtime( 功能。如果他们这样做了,那么 on 子句 td.db_date 是错误的。另外,通过将user_ID = 8 移动到 where 子句,您不会消除刚刚加入的日期吗?该限制必须在连接上以保留缺失的日期。问题是您最终会在时间维度表中获取所有日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多