假設我有一張這樣的桌子:
| ID | ColA | ColB | ColC | ... |
|-----|------|------|------|-----|
| 1 | 111 | XXX | foo | |
| 1 | 111 | XXX | bar | |
| ... | ... | ... | ... | |
| 1 | 111 | YYY | foo | |
| 1 | 111 | YYY | bar | |
| ... | ... | ... | ... | |
| 1 | 999 | XXX | foo | |
| 1 | 999 | XXX | bar | |
| ... | ... | ... | ... | |
| 1 | 999 | YYY | foo | |
| 1 | 999 | YYY | bar | |
| ... | ... | ... | ... | |
| 2 | 111 | XXX | foo | |
| 2 | 111 | XXX | bar | |
| ... | ... | ... | ... | |
右側還有其他列,其中包含各種其他值。
我想僅按列“ID”、“ColA”和“ColB”將 T-SQL 中的此表劃分為不同的組,而不考慮所有其他列。然后我想按順序對這些組進行編號。我的最終結果應該是這樣的:
| ID | ColA | ColB | ColC | ... | GroupNumber |
|-----|------|------|------|-----|-------------|
| 1 | 111 | XXX | foo | | 1 |
| 1 | 111 | XXX | bar | | 1 |
| ... | ... | ... | ... | | ... |
| 1 | 111 | YYY | foo | | 2 |
| 1 | 111 | YYY | bar | | 2 |
| ... | ... | ... | ... | | ... |
| 1 | 999 | XXX | foo | | 3 |
| 1 | 999 | XXX | bar | | 3 |
| ... | ... | ... | ... | | ... |
| 1 | 999 | YYY | foo | | 4 |
| 1 | 999 | YYY | bar | | 4 |
| ... | ... | ... | ... | | ... |
| 2 | 111 | XXX | foo | | 5 |
| 2 | 111 | XXX | bar | | 5 |
| ... | ... | ... | ... | | ... |
看起來這應該是一個簡單的問題,但我很難處理它。我有一定的懷疑,這應該以某種方式與DENSE_RANK該函式中的磁區子句一起使用。我的做法是:
SELECT
*,
DENSE_RANK() OVER(
PARTITION BY ID, ColA, ColB
ORDER BY ColC
) AS GroupNumber
FROM my_table
但這也不斷增加GroupNumber這些塊中的每一個。
uj5u.com熱心網友回復:
如果我了解您要查找的內容,那么您的想法是正確的,但是您不需要在排名函式中對資料進行磁區-您正在尋找列 Id、ColA 和整個資料集中的 ColB,而不是這些列組合中的記錄排名。
如果是這種情況,您只需洗掉您的 dense_rank() 中的磁區子句,如下所示:
SELECT
*,
DENSE_RANK() OVER(ORDER BY ID, ColA, ColB) AS GroupNumber
FROM my_table
這假設您沒有嘗試以除 ID、ColA 和 ColB 的順序之外的任何特定順序分配組 #,我認為這是您想要的,但是您還使用了“ORDER BY ColC”子句您的原始示例-我猜您這樣做是因為您需要將 order by 子句添加到排名函式中。
但是,如果您嘗試以不同的方式訂購組,則需要知道這一點并且需要一些不同的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/530942.html
標籤:sqltsql
