【发布时间】: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 中检查了以下问题:
编辑,关于重复:该问题特别是使用间隔和 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 的评论有答案。这完全超出了我的想象。如果您想添加它作为答案,我很乐意选择它作为答案。