2017-03-10 38 views
1

需要幫助來對數據結果進行分區以獲取按結果列值計算的行數。
結果來自多個視圖,但會用下面的小表來解釋問題陳述。SQL使用row_number按列值對行進行分區

create table example (seqid bigint, itemid bigint , itemname varchar(50), itemdescription varchar(50), subitemname varchar(50), columncount bigint) 

insert into example 
select 1,1,'item1','itemdescription1','sub1',3 union all 
select 2,1,'item1','itemdescription1','sub2',3 union all 
select 3,1,'item1','itemdescription1','sub3',3 union all 
select 4,1,'item1','itemdescription1','sub2.1',3 union all 
select 5,1,'item1','itemdescription1','sub2.2',3 union all 
select 6,1,'item1','itemdescription1','sub2.3',3 union all 
select 7,2,'item2','itemdescription1','sub1',2 union all 
select 8,2,'item2','itemdescription1','sub2',2 union all 
select 9,3,'item3','itemdescription1','sub1',1 union all 
select 10,3,'item3','itemdescription1','sub2',1 union all 
select 11,3,'item3','itemdescription1','sub3',1 union all 
select 12,3,'item3','itemdescription1','sub4',1 

的選擇看起來像下面

seqid |itemid  |itemname |itemdescription |subitemname |columncount 
---------------------------------------------------------------------------------- 
1  |1  |item1  |itemdescription1 |sub1  |3 
2  |1  |item1  |itemdescription1 |sub2  |3 
3  |1  |item1  |itemdescription1 |sub3  |3 
4  |1  |item1  |itemdescription1 |sub2.1  |3 
5  |1  |item1  |itemdescription1 |sub2.2  |3 
6  |1  |item1  |itemdescription1 |sub2.3  |3 
7  |2  |item2  |itemdescription1 |sub1  |2 
8  |2  |item2  |itemdescription1 |sub2  |2 
9  |3  |item3  |itemdescription1 |sub1  |1 
10  |3  |item3  |itemdescription1 |sub2  |1 
11  |3  |item3  |itemdescription1 |sub3  |1 
12  |3  |item3  |itemdescription1 |sub4  |1 

,它需要被劃分,使得該列數列的值表示每個項目的子項(to​​atal子項目/列計數的列計數=總子項目行)(即,)具有2列計數的項目名稱對於行中的子項目將具有2列。

上述數據的分區結果需要像RowId列那樣表示子項目行位置。

seqid |itemid |itemname |itemdescription |subitemname |fetchcount |RowID 
---------------------------------------------------------------------------------- 
1 |1 |item1 |itemdescription1 |sub1 |3 |1 
2 |1 |item1 |itemdescription1 |sub2 |3 |1 
3 |1 |item1 |itemdescription1 |sub3 |3 |1 
4 |1 |item1 |itemdescription1 |sub2.1 |3 |2 
5 |1 |item1 |itemdescription1 |sub2.2 |3 |2 
6 |1 |item1 |itemdescription1 |sub2.3 |3 |2 
7 |2 |item2 |itemdescription1 |sub1 |2 |1 
8 |2 |item2 |itemdescription1 |sub2 |2 |1 
9 |3 |item3 |itemdescription1 |sub1 |1 |1 
10 |3 |item3 |itemdescription1 |sub2 |1 |2 
11 |3 |item3 |itemdescription1 |sub3 |1 |3 
12 |3 |item3 |itemdescription1 |sub4 |1 |4 

我嘗試與秩或row_number和cte窗口與很多組合,但沒有得到預期的結果。也不願意使用循環或遊標來更新子項的此RowID。請幫忙。

回答

0

試試這個,這將適用於您提供的樣本數據。

select * 
    ,DENSE_RANK() OVER(PARTITION BY itemid 
         ORDER BY (CASE WHEN columncount >1 
         THEN LEFT(subitemname,LEN(subitemname)-1) 
         ELSE subitemname END)) AS RowID1 
from @example 
ORDER BY seqid 
+0

它確實給出了此樣本日期的預期結果。你能解釋一下LEFT(子名,LEN(subitemname)-1)是做什麼的,所以我可以用我的真實數據解決。 – madmonk88

+0

LEFT(subitemname,LEN(subitemname)-1)將簡單地排除字段子項名稱的最後一個字母(例如:sub1 - > sub) –

+0

我只給了一個示例數據以供理解。在真實場景中,我不會在名稱列中使用任何整數來執行此操作。 – madmonk88