如何用单条SQL语句计算ranking≤当前行的item累加和?
单条SQL实现ranking累计求和需求
针对你的Test表,要计算每个ranking对应的所有ranking小于等于当前值的item总和,可以用以下两种单条SQL方案,无需存储过程或临时表:
方法一:使用窗口函数(推荐,高效)
适用于SQL Server 2008及以上版本,利用SUM() OVER()窗口函数实现累计求和:
-- 按ranking分组后展示累计结果 SELECT ranking, SUM(total_item) OVER (ORDER BY ranking ASC) AS cumulative_item_sum FROM ( -- 先统计每个ranking的item总和 SELECT ranking, SUM(item) AS total_item FROM Test GROUP BY ranking ) AS ranked_totals ORDER BY ranking DESC;
如果需要保留原表每一行数据,并显示对应行的累计和:
SELECT item, ranking, SUM(item) OVER (ORDER BY ranking ASC) AS cumulative_item_sum FROM Test ORDER BY ranking DESC;
方法二:自连接方式(兼容低版本SQL Server)
通过自连接匹配所有ranking小于等于当前值的行,再求和:
SELECT t1.ranking, SUM(t2.item) AS cumulative_item_sum FROM Test t1 INNER JOIN Test t2 ON t2.ranking <= t1.ranking GROUP BY t1.ranking ORDER BY t1.ranking DESC;
测试结果示例
基于你提供的测试数据,以上方案都会输出:
| ranking | cumulative_item_sum |
|---|---|
| 3 | 10 |
| 2 | 5 |
| 1 | 1 |
内容的提问来源于stack exchange,提问作者user1205746
相关产品推荐
相关产品推荐

