我有一个包含以下列的表:user_id, date, parent_id
存储 (user_id, date)
上的唯一记录,其中 date
按天截断。
我的目标是创建一个为期 30 天的滚动窗口,显示每个 user_id
和 parent_id
的 date
个条目的不同计数,如下所示:
计数 | 日期 | parent_id |
---|---|---|
20 | 2020-01-20 | 1 |
30 | 2020-01-20 | 2 |
15 | 2020-01-19 | 1 |
10 | 2020-01-19 | 2 |
... |
或者换句话说,我想要每天一行,并且 parent_id 包含日期前最后 30 天的唯一 user_id 条目的计数。
我尝试首先在外部查询中使用窗口函数在子查询中进行非重复计数。然而,这导致了一个滚动窗口,其中包含每天的唯一 user_ids 总和,而不是像我想要的那样在过去 30 天内是唯一的。
SELECT
...,
sum(unique_user_count) OVER (PARTITION BY parent_id ORDER BY date RANGE BETWEEN '30 day' PRECEDING AND CURRENT ROW) as result
FROM
SELECT
count(DISTINCT user_id) as unique_user_count,
...
我想我需要做这样的事情:
SELECT ...,
count(DISCTINCT user_id)
OVER (PARTITION BY parent_id ORDER BY date RANGE BETWEEN '30 day' PRECEDING AND CURRENT ROW) as unique_user_count
但是,Postgres 显然不支持窗口函数的不同计数,而且我没有使用人们建议的 dense_rank()
或 row_number()
技巧(例如 here )。有没有人有什么建议?也许我没有使用正确的分区列?