1

SQL Server 2005+。

我有一个包含以下架构/数据的表:

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 有两行。第二行,日期为 2010 年 1 月 8 日,将是我的匹配项,即 1 和 2 = 3 的总和。

乔只有一行,他会匹配,因为 4 已经大于 3。

Nat 有 3 行,在他的情况下,匹配行是日期为 2010 年 1 月 3 日的第 2 行,因为 1 和 3 之和为 4,并且 4 大于 3。

所以我的结果是:

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

我知道我可以用光标来做到这一点,但我希望采用基于集合的方法。

想法?

4

1 回答 1

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
于 2012-07-25T22:55:54.267 回答