2012-07-25 56 views
1

SQL Server 2005+。TSQL按部分聚合篩選

我有以下架構/數據表:

Name Slots Date 
--------------------- 
Bob  1  1/1/2010 
Bob  2  1/8/2010 
Joe  4  1/2/2010 
Nat  1  1/4/2010 
Nat  3  1/3/2010 
Nat  8  1/9/2010 

我需要做的是找到行這對於導致這個名字的槽的總和達到或超過一個特定的名稱任意值 - 假設3.

所以在上面的例子中,Bob有兩行。第二行,日期爲1/8/2010,將作爲1和2 = 3的總和我的匹配。

Joe只有一行,他會匹配,因爲4已經大於3。

NAT有3排,並在他的情況下的匹配的行是第二行以來的1之和的2010年1月3日的日期和3是4,並且圖4是大於3

所以我的結果是:

Name SlotsSum Date 
------------------------- 
Bob  3  1/8/2010 
Joe  4  1/2/2010 
Nat  4  1/3/2010 

我知道我可以用光標做到這一點,但我希望爲基於集合的方法。

想法?

+0

Nat的順序是否正確?您在示例表格中顯示的日期不合適,我認爲應該讓您的最終結果爲Nat 3 1/3/2010。 – Bert 2012-07-25 22:55:35

回答

2

使用兩種技術,我們可以做你想做的。 CROSS APPLY來計算運行總數,並且ROW_NUMBER因此我們可以選擇超過您的限制的第一行。

declare @MyTable table (Name varchar(10), Slots int, Date date) 
insert @MyTable values 
('Bob',  1 ,  '1/1/2010'), 
('Bob',  2 ,  '1/8/2010'), 
('Joe',  4 ,  '1/2/2010 '), 
('Nat',  1 ,  '1/4/2010 '), 
('Nat',  3 ,  '1/3/2010 '), 
('Nat',  8 ,  '1/9/2010 ') 

declare @Limit int = 3 

;with cte as 
(
    select Name, Slots, Date, RunningTotal, 
    ROW_NUMBER() over (partition by Name order by Name, Date) as rn 
    from @MyTable rsTable 
    cross apply 
    (
     select SUM(Slots) as RunningTotal 
     from @MyTable rsApply 
     where Date <= rsTable.Date and Name = rsTable.Name 
    ) rsRunningTotal 
    where RunningTotal >= @Limit 

) 
select Name, RunningTotal, Date 
from cte 
where rn = 1 
+0

你只是想起了我。 :) – RMD 2012-07-26 15:07:24