簡體   English   中英

SQL Increment值取決於其他列中的更改

[英]SQL Increment value depending on changes in other columns

與此類似: T-SQL基於列值的變化遞增計數器

我有這張桌子:

ID  |  VALUE
5   |  A    
6   |  A    
6   |  A    
6   |  B    
6   |  A    
6   |  B    
6   |  B    
6   |  A    
6   |  C    

期望的結果是:

ID  |  VALUE    | GROUP
5   |  A        | 1
6   |  A        | 2
6   |  A        | 2
6   |  B        | 3
6   |  A        | 4
6   |  B        | 4
6   |  B        | 4
6   |  A        | 5
6   |  C        | 6

一個新列(GROUP),其值在前兩列每次更改時遞增,但在前兩列值與上一行相同時不會遞增。

到目前為止,使用RANK OVER()函數,我能達到的最好效果是:

ID  |  VALUE    | GROUP
5   |  A        | 1
6   |  A        | 2
6   |  A        | 2
6   |  B        | 3
6   |  A        | 2
6   |  B        | 3
6   |  B        | 3
6   |  A        | 1
6   |  C        | 4

我假設您有一個名為ordering的列,它指定記錄的順序。 SQL表表示無序集,因此行沒有“自然”排序。

您可以使用行號的差異然后進行一些額外的操作來執行您想要的操作:

select id, value, dense_rank() over (order by grp) as grouping
from (select t.*,
             min(ordering) over (partition by id, value, seqnum - seqnum_iv) as grp
      from (select t.*,
                   row_number() over (order by ordering) as seqnum,
                   row_number() over (partition by id, value order by ordering) as seqnum_iv
            from t
           ) t
     ) t;

最里面的子查詢計算值序列。 我鼓勵你看看結果,看看發生了什么。 每個“島嶼”的差異都是不變的。

第二個獲得每個組的最小ordering值。 然后,可以使用它將順序值指定為最終結果。

暫無
暫無

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

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