填补PostgreSQL查询结果中的空白

填补PostgreSQL查询结果中的空白,sql,postgresql,Sql,Postgresql,我有一个名为data\u users id | signed_up_at | product_id -------+--------------------------------- 20030 | 2017-09-15 12:51:45 | 2 20122 | 2017-09-15 12:51:45 | 2 21461 | 2017-09-15 12:51:45 | 2 20150 | 2017-09-13 10:10:10 | 2 19858 | 2017-0

我有一个名为
data\u users

  id   |    signed_up_at     | product_id
-------+---------------------------------
 20030 | 2017-09-15 12:51:45 | 2
 20122 | 2017-09-15 12:51:45 | 2
 21461 | 2017-09-15 12:51:45 | 2
 20150 | 2017-09-13 10:10:10 | 2
 19858 | 2017-09-10 23:00:54 | 2
 20126 | 2017-09-10 23:00:28 | 2
 20888 | 2017-09-10 23:00:28 | 2
 20143 | 2017-09-10 23:00:28 | 2
 21369 | 2017-09-10 23:00:02 | 2
我使用查询从该表中查找每天的累计总和:

SELECT DATE_TRUNC('day', signed_up_at::timestamptz) AS date,
       SUM(COUNT(*)) OVER (ORDER BY DATE_TRUNC('day', signed_up_at::timestamptz)) AS sum
FROM "data_users"
WHERE product_id = 2
GROUP BY date ORDER BY date
这会产生类似这样的结果

          date          | sum
------------------------+------
 2017-09-15 00:00:00+02 | 1693
 2017-09-13 00:00:00+02 | 1690
 2017-09-10 00:00:00+02 | 1689
正如你所看到的,我有几天的时间间隔,没有用户在注册

与此相反,我希望得到以下结果

          date          | sum
------------------------+------
 2017-09-15 00:00:00+02 | 1693
 2017-09-14 00:00:00+02 | 1690
 2017-09-13 00:00:00+02 | 1690
 2017-09-12 00:00:00+02 | 1689
 2017-09-11 00:00:00+02 | 1689
 2017-09-10 00:00:00+02 | 1689
所以我想得到每天的总和,而不仅仅是那些在注册的
用户的天数

我正试图通过
GENERATE_SERIES
实现这一点,但我没有得到想要的结果:

SELECT DATE_TRUNC('day', signed_up_at::timestamptz) AS date,
       SUM(COUNT(*)) OVER (ORDER BY DATE_TRUNC('day', signed_up_at::timestamptz)) AS sum
FROM (SELECT GENERATE_SERIES(MIN(signed_up_at)::DATE, MAX(signed_up_at)::DATE, '1 DAY'::INTERVAL) AS date
      FROM "data_users") AS d
LEFT OUTER JOIN "data_users" u ON u.signed_up_at::DATE = d.date::DATE
WHERE product_id = 2
GROUP BY signed_up_at ORDER BY date

我应该如何修改我的查询以支持这一点?Turo的回答帮助我指出了正确的方向,但我现在对
WHERE
子句有问题。

我手头没有postgress,因为我看到计数和分组依据中的问题,请尝试

SELECT DATE_TRUNC('day', date::timestamptz) AS date,
       SUM(COUNT(signed_up_at)) OVER (ORDER BY DATE_TRUNC('day', 
date::timestamptz)) AS sum
FROM (SELECT GENERATE_SERIES(MIN(signed_up_at)::DATE, MAX(signed_up_at)::DATE, 
'1 DAY'::INTERVAL) AS date
      FROM "data_users") AS d
LEFT OUTER JOIN "data_users" u ON u.signed_up_at::DATE = d.date::DATE
GROUP BY date ORDER BY date

我收到一个错误:
error:列“u.signed\u-up\u-at”必须出现在GROUP BY子句中或用于聚合函数
。抱歉,在select(两次)中忘记了signed\u-up\u-at。我有一个where子句把这搞砸了,我将编辑我的问题。where子句有什么问题?我的猜测是:其中2=coalesce(product_id,2)可能会有所帮助