Postgres 计数与窗口函数不同

时间:2021-01-25 15:26:43

标签: postgresql count distinct window-functions

我有一个包含以下列的表:user_id, date, parent_id 存储 (user_id, date) 上的唯一记录,其中 date 按天截断。

我的目标是创建一个为期 30 天的滚动窗口,显示每个 user_idparent_iddate 个条目的不同计数,如下所示:

<头>
计数 日期 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 )。有没有人有什么建议?也许我没有使用正确的分区列?

0 个答案:

没有答案