1

SQLServer2005以降。

次のスキーマ/データを含むテーブルがあります。

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としましょう。

したがって、上記の例では、ボブには2つの行があります。2010年1月8日の日付の2行目は、1と2=3の合計としての私の一致になります。

ジョーには1行しかなく、4はすでに3より大きいので、彼は一致します。

ナットには3つの行があり、彼の場合、1と3の合計が4であり、4が3より大きいため、一致する行は2010年1月3日の日付の2番目の行です。

したがって、私の結果は次のとおりです。

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

カーソルでこれを実行できることはわかっていますが、セットベースのアプローチを望んでいます。

考え?

4

1 に答える 1

2

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 に答える