簡體   English   中英

使用row_number按行值對行進行SQL分區

[英]SQL partitioning rows with row_number by a columns value

需要幫助來對數據結果進行分區,以便通過結果列值獲取行號。
結果來自多個視圖,但將使用下面的小表解釋問題陳述。

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

並且需要對其進行分區,使得columncount列值表示每個項目的子項目的列數(toatal子項/列計數=總子項目行)(即,)具有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

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

試試這個,這將適用於您提供的示例數據。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM