加入日历表中缺少的日期[重复]

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),这是我尝试加入userdatain_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 子句,您不会消除刚刚加入的日期吗?该限制必须在连接上以保留缺失的日期。问题是您最终会在时间维度表中获取所有日期。

以上是关于加入日历表中缺少的日期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python日历日期缺少空格

怎么在java日历程序所输入的日期上加入符号?

使用日历视图减去日期[重复]

将日期对象转换为日历对象 [重复]

通过日历选择日期无法输入[重复]

如何在日历视图中禁用未来日期[重复]