我有一个包含信息和日期的表,其中包含一些缺失的表,因此我希望将该表与日历表一起填充缺失日期,并将同一行中另一列中的值设置为null。这是一个例子:
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),这是我尝试加入的{{1} }' s userdata
列(位于unix_time中)。
编辑:我在SO中检查了以下问题:
编辑,关于副本:特别是这个问题是使用interval和date_add来比较它们的表。我正在使用日历表来加入它们。虽然相似,但我认为他们不会有同样的解决方案。
解决方案:感谢xQBert,他指出了错误:
问题:将组放在userdata表和select上,你基本上忽略了时间维度数据。 Userdata中没有2018-4-29日期(对于用户8)修复选择&分组来源于时间维度数据并解决了问题。
因此,我将in_date
更改为GROUP BY day(from_unixtime(in_date))
。
答案 0 :(得分:0)
您需要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
表被视为日历表。