我有一个查询,它从Redshift获得每个月的页面浏览量计数,但我无法显示0行。我在几个月的表格中right join
,但它仍然没有通过
这是我的问题:
SELECT
coalesce(count(*), 0) as count,
date_trunc('month', pv_date) as month_date,
months.month_date as joined_month_date
FROM pageviews
RIGHT JOIN months
on date_trunc('month', pv_date) = months.month_date
GROUP BY month_date, joined_month_date
返回类似的信息
15 | 2020-11-01 00:00:00 | 2020-11-01 00:00:00
23 | 2020-09-01 00:00:00 | 2020-09-01 00:00:00
我错过了什么?我想要2020年10月的0排。
我认为LEFT JOIN
更容易理解。您需要对pageviews
表中的一列进行计数才能获得不匹配项。并在months
:中按列聚合
SELECT count(pv.pv_date) as count,
m.month_date as joined_month_date
FROM months m LEFT JOIN
pageviews pv
ON date_trunc('month', pv_date) = m.month_date
GROUP BY m.month_date;
这个问题是count(*)
,因为这将计算FROM子句中的所有行,无论它们是否具有左侧值(页面视图(。因此,当只有月份的数据时,联接计数将返回1(假设每个月都在月份表中一次(。您需要计算页面视图表行中始终存在的内容,如pv_date。当count对列进行操作时,如果该列的值为NULL,则它不会递增。
此外,只要组中至少有1行,count(*(就永远不会返回NULL,因此不需要合并。只要每个组中都有行,count(pv_date(就是如此,如果该组中pv_date的所有值都为NULL,则返回0。
如果这不能纠正问题,请通过删除count和groupby子句来仔细检查源数据和联接是否按预期操作,并确保您获得的是2020-10-01的行。