如何通过SQL查询统计每个用户指定日期段内第3至第8天的unitsold总和?
解决方法
要实现统计每个Name在2022年3月1日至4月1日期间自身第3天到第8天的unitsold总和,你需要先给每个用户的日期按顺序编号,再筛选指定区间的记录求和,具体实现如下:
完整SQL语句
WITH daily_sales AS ( -- 先合并同一用户同一天的销量(若单天仅一条记录可省略此CTE) SELECT Name, date_col, -- 替换为你的实际日期列名 SUM(unitsold) AS daily_unitsold FROM table1 WHERE date_col BETWEEN '2022-03-01' AND '2022-04-01' GROUP BY Name, date_col ), ranked_days AS ( -- 给每个用户的日期按顺序分配序号 SELECT Name, daily_unitsold, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY date_col ASC) AS day_rank FROM daily_sales ) -- 筛选第3-8天的记录并求和 SELECT Name, SUM(daily_unitsold) AS total_unitsold_day3_to_day8 FROM ranked_days WHERE day_rank BETWEEN 3 AND 8 GROUP BY Name;
关键说明
- 每日销量合并:如果同一个Name在同一天有多条销量记录,
daily_salesCTE会先合并成单天总销量,避免把同一天的多条记录算作不同天数。 - 日期序号分配:
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY date_col ASC)会给每个用户的日期按升序生成独立序号,确保每个用户的第1天、第3天是基于自身的日期序列计算的。 - 原SQL问题:你之前的语句
sum(unitsold) over (partion by Name order by Asc)存在语法错误(缺少排序列),且该窗口函数是累计求和(从第1天到当前天的累加值),无法直接实现指定区间的求和逻辑。
内容的提问来源于stack exchange,提问作者Sanky Ach
相关产品推荐
相关产品推荐

