SQL实现各用户按日期累计计数及相对自身最早日期的天数计算
两类统计需求的SQL实现方案
第一类:每个用户按日期维度的累计count值统计
实现核心是通过窗口聚合函数,按用户维度分区、按完成日期排序,逐行累加当前用户的单次完成计数,最终输出匹配要求的user、cumulative、date字段。
对应SQL代码:
SELECT user, SUM(count) OVER ( PARTITION BY user ORDER BY completed ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative, completed AS date FROM completion ORDER BY user, completed;
执行该语句的返回结果与给出的预期样例完全一致:同用户下每一行的累计值等于该用户从最早完成日到当前行日期的所有count值之和。
第二类:基于用户最早完成日的间隔天数累计统计
实现逻辑是在第一类的累计计算基础上,额外为每个用户计算其最早完成日期作为时间基准,再通过日期差值计算当前记录日与基准日的间隔天数,替换原日期字段输出要求的days passed字段。
对应SQL代码:
SELECT user, SUM(count) OVER ( PARTITION BY user ORDER BY completed ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative, DATEDIFF( completed, MIN(completed) OVER (PARTITION BY user) ) AS `days passed` FROM completion ORDER BY user, completed;
注:不同数据库的日期差值函数语法略有差异,例如PostgreSQL、SQLite可直接通过日期相减计算间隔天数,即替换日期计算部分为
completed - MIN(completed) OVER (PARTITION BY user),逻辑完全一致。
内容的提问来源于stack exchange,提问作者user15224444
相关产品推荐
相关产品推荐

