Redshift中的月度计数行数-如何在没有活动的月份的结果中包括0行



我有一个查询,它从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的行。

相关内容

最新更新