当我尝试达到期望的结果时遇到问题。这项任务看起来很简单-每天对排名靠前的国家/地区的事件发生进行计数。
主表如下:
id | date | country | col1 | col2 | ...
1 | 2018-01-01 21:21:21 | US | value 1 | value 2 | ...
2 | 2018-01-01 22:32:54 | UK | value 1 | value 2 | ...
我要从该表中获取按国家/地区划分的每日事件计数,这是通过
实现的SELECT date::DATE AT TIME ZONE 'UTC', country, COALESCE(count(id),0) FROM tab1
GROUP BY 1, 2
当英国用户在2018年1月2日没有任何活动时就会出现问题
country_events
date | country | count
2018-01-01 | US | 23
2018-01-01 | UK | 5
2018-01-02 | US | 30
2018-01-02 | UK | 0 -> is desired result, but row is missing
我尝试生成要查找的日期序列和国家/地区序列,然后CROSS JOIN
这两个表。这个helper
和第date
和country
列已与我的结果表保持联系,例如
SELECT * FROM helper h
LEFT JOIN country_events c ON c.date::DATE = h.date::DATE AND c.country = h.country
我正在使用PostgreSQL。
答案 0 :(得分:0)
您需要外部联接,而不是交叉联接:
SELECT tab1.date::date, tab1.country, coalesce(count(*), 0)
FROM generate_series(TIMESTAMP '2018-01-01 00:00:00',
TIMESTAMP '2018-01-31 00:00:00',
INTERVAL '1 day') AS ts(d)
LEFT JOIN tab1 ON tab1.date >= ts.d AND tab1.date < ts.d + INTERVAL '1 day'
GROUP BY tab1.date::date, tab1.country
ORDER BY tab1.date::date, tab1.country;
这将提供2018年1月的所需列表。