加入日历表中缺少的日期[重复]
Posted
技术标签:
【中文标题】加入日历表中缺少的日期[重复]【英文标题】: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),这是我尝试加入userdata
的in_date
列的日期(在 unix_time 中)。
编辑:我在 SO 中检查了以下问题:
Join to Calendar Table - 5 Business Days
What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?
编辑,关于重复:该问题特别是使用间隔和 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 的评论有答案。这完全超出了我的想象。如果您想添加它作为答案,我很乐意选择它作为答案。 【参考方案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 子句,您不会消除刚刚加入的日期吗?该限制必须在连接上以保留缺失的日期。问题是您最终会在时间维度表中获取所有日期。以上是关于加入日历表中缺少的日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章