我有一张看起来像这样的 table
UserID LastDayofMonth Count
1234 2015-09-30 00:00:00 12
1237 2015-09-30 00:00:00 5
3233 2015-09-30 00:00:00 3
8336 2015-09-30 00:00:00 22
1234 2015-10-31 00:00:00 8
1237 2015-10-31 00:00:00 5
3233 2015-10-31 00:00:00 7
8336 2015-11-30 00:00:00 52
1234 2015-11-30 00:00:00 8
1237 2015-11-30 00:00:00 5
3233 2015-11-30 00:00:00 7
(大约有 10,000 行)。正如您在示例中看到的,用户 ID 8336 没有 10 月 31 日的记录(日期是每月的,但始终是该月的最后一天,我想保留这一天)。如何返回一个包含四个月期间记录的表,以便像 8336 这样的用户获得像这样的记录
8336 2015-10-31 00:00:00 0
我确实有一个日历表,其中包含我可以使用的所有日期。
最佳答案
如果我理解正确的话,您需要每个用户和每个月底的记录。并且,如果该记录当前不存在,则您需要值为 0。
这是一个两步过程。首先使用交叉连接
生成所有行。然后使用 left join
获取值。
所以:
select u.userId, l.LastDayofMonth, coalesce(t.cnt, 0) as cnt
from (select distinct userId from t) u cross join
(select distinct LastDayofMonth from t) l left join
t
on t.userId = u.userId and t.LastDayofMonth = l.LastDayofMonth;
关于sql - 在每月最后一天之前填充缺失数据的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34322533/