2016-07-27 33 views
0

我有一組數據,我需要生成SetIds。基本上,如果我在哪裏走過第一個數據集,並在列ID上有一個順序,那麼每次我點擊一個RecordType時,我都想增加一個計數器。請參閱所需輸出的第二個示例。T-SQLHelp - 生成Ids

Id  RecordType Amount 
---------------------------- 
1   5   1.00 
2   6   1.00 
3   7   3.00 
5   5   1.00 
6   6   .50 
7   6   .50 
8   8   1.00 
9   5   .05 

Id  RecordType Amount SetId 
------------------------------------- 
1   5   1.00  1 
2   6   1.00  1 
3   7   3.00  1 
5   5   1.00  2 
6   6   .50  2 
7   6   .50  2 
8   8   1.00  2 
9   5   .05  3 
10   6   .05  3 
+0

提示:這是有幫助的同時與相應的軟件標籤數據庫問題(MySQL和甲骨文, DB2,...)和版本,例如'的SQL服務器2014'。語法和功能的差異往往會影響答案。 – HABO

回答

0

您最初的樣本數據丟失的ID是10

DECLARE @Table Table (Id Int, RecordType Int, Amount Decimal(9,2)) 
Insert Into @Table (Id,RecordType,Amount) Values 
(1,5,1), 
(2,6,1), 
(3,7,3), 
(5,5,1), 
(6,6,.5), 
(7,6,.5), 
(8,8,1), 
(9,5,.05), 
(10,6,.05) 

Select * 
     ,SetId = Sum(IIF(RecordType=5,1,0)) over (Order by ID) 
From @Table 
Order By Id 

返回

Id RecordType Amount Flag SetId 
1 5   1.00 1  1 
2 6   1.00 0  1 
3 7   3.00 0  1 
5 5   1.00 1  2 
6 6   0.50 0  2 
7 6   0.50 0  2 
8 8   1.00 0  2 
9 5   0.05 1  3 
10 6   0.05 0  3 
+0

哇。這是不好的屁股。 thx – vin

+0

@vin好吧,這讓我微笑。感謝那' –

0
DECLARE @DataX TABLE (
     Id   INT IDENTITY 
    , RecordType INT 
    , Amount  DECIMAL(5,2) 
    , SetId   INT 
    ) 

INSERT INTO @DataX (RecordType, Amount) VALUES 
     (5,1) 
    , (6,1) 
    , (7,3) 
    , (5,1) 
    , (6,.5) 
    , (6,.5) 
    , (8,1) 
    , (5,.5) 

; WITH SetId 
    AS (
     SELECT Id, SUM (CASE WHEN RecordType = 5 THEN 1 ELSE 0 END) OVER (ORDER BY Id) AS SetId 
      FROM @DataX 
     ) 

UPDATE dx1 
    SET dx1.SetId = (SELECT SetId.SetId) 
     FROM @DataX dx1 
      JOIN SetId 
       ON dx1.Id = SetId.Id 

SELECT * FROM @DataX