sql - SQL 窗口函数以每日级别计算不同的月份日期
问题描述
我正在尝试获取一个查询,该查询将为我提供每天的 customerids 计数,但对于当前月份来说是唯一的(例如,如果 customerid 出现在当月的 1 日,我不想在 21 日再次计算它)。
我希望输出类似于
日期 | 每月独立客户 |
---|---|
2021-04-29 | 500 |
2021-04-30 | 523 |
2021-05-01 | 45 |
2021-05-02 | 55 |
2021-05-03 | 72 |
... | ... |
所以我有
SELECT DATE_TRUNC('day', date) AS day,
DATE_TRUNC('month', date) AS month,
COUNT(DISTINCT customerid)
FROM table
GROUP BY 1, 2
但我基本上不知道我需要什么窗口函数(或任何其他方法)才能获得这个输出?
解决方案
好吧,如果你想要一个额外的列,那么你需要两个窗口函数。这个想法是计算用户在当月第一次出现的时间。
您的代码看起来像 Postgres,所以我将使用该语法:
SELECT DATE_TRUNC('day', date) AS day,
DATE_TRUNC('month', date) AS month,
COUNT(DISTINCT customerid) as customers_in_day,
SUM(COUNT(*) FILTER (WHERE seqnum = 1)) OVER (ORDER BY DATE_TRUNC('day', date)) as customers_in_month
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY customerid, DATE_TRUNC('day', date) ORDER BY day) as seqnum
FROM table t
) t
GROUP BY 1, 2
推荐阅读
- mysql - 链接服务器“MY_LINKED_SERVER”的 OLE DB 提供程序“MSDASQL”不包含表“my_database.my_table”
- active-directory - 为什么要在 AD 中为开发人员提供电子邮件地址和域地址?
- python - 将第二行和第二行上的相同值替换为 0
- firebase - 如何在firestore上的serviceConfig数组的末尾添加一个新对象
- android - 使用随机生成密钥检索firebase中数据列表的方法?谢谢
- mysql - 我不断收到“外键引用无效列?
- oracle - ORA-02291:违反完整性约束 (SQL_HLZTBRUASDUURQGIOAYPNRAFC.EMPLOYEE_ID) - 未找到父键 ORA-06512:在“SYS.DBMS_SQL”,第 1721 行
- mongodb - 使用不同的返回唯一的mongodb文档不起作用
- ruby-on-rails - has_many form_with 中未定义的方法“networkinterface_path”
- flutter - 当我调用 Web 服务的 url 时连接被拒绝