簡體   English   中英

DENSE_RANK()查詢

[英]DENSE_RANK() Query

我有一些類似於下面的數據集...

ID        RowNumber
101       1
101       2
101       3
101       4
101       5
101       1
101       2

我想得到的是下面的另一列...

ID        RowNumber        New
101       1                1
101       2                1
101       3                1
101       4                1
101       5                1
101       1                2
101       2                2

我玩過density_rank(),但是沒有這種運氣。

戈登已經提到過,您需要一列來指定數據的順序。 如果我將ID按列排序,則以下邏輯可以幫助您獲得所需的結果-

WITH your_table(ID,RowNumber)
AS
(
SELECT 101,1 UNION ALL
SELECT 101,2 UNION ALL
SELECT 101,3 UNION ALL
SELECT 101,4 UNION ALL
SELECT 101,5 UNION ALL
SELECT 101,1 UNION ALL
SELECT 101,2
)

SELECT A.ID,A.RowNumber,
SUM(RN) OVER 
(
    ORDER BY ID
    ROWS BETWEEN UNBOUNDED  PRECEDING AND CURRENT ROW
) +1 New
FROM
(
    SELECT *, 
    CASE 
        WHEN LAG(RowNumber) OVER(ORDER BY ID) > RowNumber THEN 1 
        ELSE 0 
    END RN
    FROM your_table
)A

如果RowNumber中的值小於上一個,則上述行將始終更改ROW NUMBER。 另外,如果您希望在找到值1時更改行號,也可以實現相同的輸出。 這是位靜態選項-

SELECT A.ID,A.RowNumber,
SUM(RN) OVER 
(
    ORDER BY ID
    ROWS BETWEEN UNBOUNDED  PRECEDING AND CURRENT ROW
)  New
FROM(
    SELECT *, 
    CASE 
        WHEN RowNumber = 1 THEN 1 
        ELSE 0 
    END RN
    FROM your_table
)A 

輸出是-

ID  RowNumber   New
101 1           1
101 2           1
101 3           1
101 4           1
101 5           1
101 1           2
101 2           2

SQL表表示無序集。 除非有列指定排序,否則沒有排序。

假設您有這樣的一列,您可以簡單地通過計算直到每個點的“ 1”的數目來做您想做的事情:

select t.*,
       sum(case when rownumber = 1 then 1 else 0 end) over (partition by id order by <ordering column>) as new
from t;

正如戈登所暗示的,您的示例中沒有默認順序,因此很難想象如何獲得確定性的結果(例如,向同一查詢提供相同的值總是得到完全相同的答案)。

此樣本數據包括一個順序PK列,用於定義此集合的順序

DECLARE @tbl TABLE (PK INT IDENTITY, ID INT, RowNumber INT)
INSERT @tbl(ID, RowNumber) VALUES (101,1),(101,2),(101,3),(101,4),(101,5),(101,1),(101,2);

SELECT t.* FROM @tbl AS t;

返回:

PK    ID     RowNumber
----- ------ -----------
1     101    1
2     101    2
3     101    3
4     101    4
5     101    5
6     101    1
7     101    2

此查詢使用DENSE_RANK來獲取所需的信息:

DECLARE @tbl TABLE (PK INT IDENTITY, ID INT, RowNumber INT)
INSERT @tbl(ID, RowNumber) VALUES (101,1),(101,2),(101,3),(101,4),(101,5),(101,1),(101,2);

SELECT t.ID, t.RowNumber, New = DENSE_RANK() OVER (ORDER BY t.PK - RowNumber)
FROM @tbl AS t;

返回:

ID    RowNumber   New
----- ----------- ------
101   1           1
101   2           1
101   3           1
101   4           1
101   5           1
101   1           2
101   2           2

請注意,ORDER BY New不會影響計划。

請嘗試以下操作將數據加載到Temp表中

選擇id,RowNumber,Row_number()over(按行號划分按ID排序)從#temp新建按Row_number()over(按行號分區按ID排序),RowNumber

暫無
暫無

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

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