SQL求和与分组需求:按ITEM和日期计算区间内VALUE总和
源数据表
| ITEM | Date | VALUE | START DATE | END DATE |
|---|---|---|---|---|
| 1 | 01 Jan 2023 | 15 | 01 Jan 2023 | 02 Jan 2023 |
| 1 | 02 Jan 2023 | 20 | 02 Jan 2023 | 03 Jan 2023 |
| 1 | 03 Jan 2023 | 25 | 03 Jan 2023 | 04 Jan 2023 |
| 1 | 04 Jan 2023 | 40 | 04 Jan 2023 | 05 Jan 2023 |
| 2 | 01 Jan 2023 | 30 | 01 Jan 2023 | 02 Jan 2023 |
| 2 | 02 Jan 2023 | 20 | 02 Jan 2023 | 03 Jan 2023 |
| 2 | 03 Jan 2023 | 10 | 03 Jan 2023 | 04 Jan 2023 |
| 2 | 04 Jan 2023 | 40 | 04 Jan 2023 | 05 Jan 2023 |
目标结果表
| ITEM | Date | VALUE_SUM |
|---|---|---|
| 1 | 01 Jan 2023 | 35 |
| 1 | 02 Jan 2023 | 45 |
| 1 | 03 Jan 2023 | 65 |
| 1 | 04 Jan 2023 | 40 |
| 2 | 01 Jan 2023 | 50 |
| 2 | 02 Jan 2023 | 30 |
| 2 | 03 Jan 2023 | 50 |
| 2 | 04 Jan 2023 | 40 |
解决方案(SQL)
通过自连接即可实现需求,逻辑是匹配同ITEM下所有区间包含当前行Date的记录,再聚合求和:
SELECT t1.ITEM, t1.Date, SUM(t2.VALUE) AS VALUE_SUM FROM your_table t1 JOIN your_table t2 ON t1.ITEM = t2.ITEM WHERE t1.Date BETWEEN t2.START_DATE AND t2.END_DATE GROUP BY t1.ITEM, t1.Date ORDER BY t1.ITEM, t1.Date;
逻辑说明
- 自连接:用
t1标记需要计算总和的目标行,t2标记同ITEM下的所有待检查行; - 区间筛选:
t1.Date BETWEEN t2.START_DATE AND t2.END_DATE确保目标行日期落在待检查行的区间内; - 分组聚合:按
ITEM和Date分组,对符合条件的VALUE求和得到VALUE_SUM。
如果使用支持窗口函数的SQL引擎(如PostgreSQL、BigQuery),也可以用条件求和的窗口写法:
SELECT ITEM, Date, SUM(CASE WHEN Date BETWEEN START_DATE AND END_DATE THEN VALUE ELSE 0 END) OVER (PARTITION BY ITEM) AS VALUE_SUM FROM your_table ORDER BY ITEM, Date;
内容的提问来源于stack exchange,提问作者pancufer
相关产品推荐
相关产品推荐

