postgresql 查询表以获取记录的历史计数

093gszye  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(186)

我正在尝试编写一个Postgres查询,它允许我查询users表,以计算每个月创建的用户数量的变化,并按月对结果进行分组。
users表有一个created_at列。
例如:假设应用程序于2022年12月上线,并且在12月期间创建了10个用户,那么12月的计数应该是10。如果在1月份创建了另外5个用户,则1月份的计数应为15(12月份的10个加上1月份的5个)。等等。
我想我有一种工作,但我想知道如果这是正确的方式来做它?特别是因为我应该能够将原始SQL转换为ActiveRecord查询。

select date_trunc('month', created_at) + interval '1 month' as month, 
COUNT(*) OVER (ORDER BY date_trunc('month', created_at)) as historic_count
from users
kyks70gy

kyks70gy1#

你走对了。下面演示了一个返回所述结果的查询:

WITH t(created_at) AS (
  VALUES ('2022-12-04'::date), ('2022-12-07'::date), ('2022-12-10'::date), ('2022-12-11'::date), ('2022-12-17'::date),
         ('2022-12-19'::date), ('2022-12-23'::date), ('2022-12-25'::date), ('2022-12-26'::date), ('2022-12-28'::date),
         ('2023-01-18'::date), ('2023-01-19'::date), ('2023-01-22'::date), ('2023-01-23'::date), ('2023-01-25'::date)
),
by_months AS (
  SELECT date_trunc('month', t.created_at) creation_month, count(*) AS creation_count
    FROM t
    GROUP BY creation_month
)
SELECT creation_month::date AS month, sum(creation_count) OVER (ORDER BY creation_month) AS historic_count
  FROM by_months
  ORDER BY creation_month;

第一步是获取每月的创建次数。然后在顶层查询中计算这些计数的累积和。有一个隐式ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW帧定义与窗口化sum聚合函数相关联。
由于聚合的原因,如果不使用显式SQL,这是一个难以在ActiveRecord中实现的查询。

相关问题