SQL 递归查询 - 对排名较低的行求和

SQL Recursive Query - Sum Rows with Lesser Rank

使用 MS SQL - 2012 年 我正在尝试 运行 一个 SQL 查询,该查询按产品 ID 对行进行排名。然后计算代表排名小于或等于它的行的总和。 我设置了一个公式来执行此操作并且它有效但速度慢且资源昂贵。

我的直觉是有一个 CTE 或 Rank 函数可以满足我的要求 - 我只是不知道。

如果一个产品有 4 行,我可以使用排名重新计算较小行数量的总和。

Product   Order     Qty Rank    Sum  
Apple     John      5   1       5  
Apple     Josh      2   2       7  
Apple     Jacob     1   3       8  
Apple     Jennifer  1   4       9  

第 1 行总和等于(第 1 行数量)
第 2 行总和等于(第 1 行数量,第 2 行数量)
第 3 行总和等于(第 1 行数量,第 2 行数量,第 3 行数量)
第 4 行总和等于(第 1 行数量,第 2 行数量,第 3 行数量,第 4 行数量)

如有任何帮助,我们将不胜感激。

提前致谢。 乔什

对于Sql Server 2012+:

select *, sum(qty) over(partition by product order by rank) as [sum]
from products

Sql Server 2008-:

select *, (select sum(qty) from products p2
           where p1.product = p2.product and p2.rank <= p1.rank) as [sum]
from products p1

如果我理解正确的话,我认为你想要这个。还提供了示例代码,如果第一个假设有误请评论。

create table #apples
(product varchar(20)
,orders varchar(20)
,qty int
)

insert into #apples
values ('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','josh',1)
,('apple','josh',1)
,('apple','jacob',1)
,('apple','jennifer',1)
Go

With Tots as 
(Select product,orders,sum(qty) 'Sums', RANK() OVER (partition by product ORDER BY SUM(QTY) desc,orders) 'rnk'
 from #apples
 group by product,orders)

select t1.rnk, SUM(t2.Sums)
from tots t1
    inner join Tots t2
    on t1.rnk >= t2.rnk
    group by t1.rnk