选择没有价值的记录

时间:2018-11-15 18:09:01

标签: postgresql join

当我尝试达到期望的结果时遇到问题。这项任务看起来很简单-每天对排名靠前的国家/地区的事件发生进行计数。

主表如下:

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和第datecountry列已与我的结果表保持联系,例如

SELECT * FROM helper h
LEFT JOIN country_events c ON c.date::DATE = h.date::DATE AND c.country = h.country

我正在使用PostgreSQL。

1 个答案:

答案 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月的所需列表。