簡體   English   中英

Oracle DENSE_RANK()

[英]Oracle DENSE_RANK()

我正在嘗試使用Oracle中的DENSE_RANK()函數作為將任意“主鍵”附加到數據的唯一分組的一種方式。 我的數據集是過去幾天針對不同“資產”在不同“資產”上執行的交易的列表。 數據集由ASSET ASC和DATE ASC進行了預排序,如下所示。


ASSET       LOCATION        DATE
A           LOC_A       9/1/2017
A          LOC_A        9/1/2017
A          LOC_B        9/5/2017
A          LOC_B        9/7/2017
A          LOC_A        9/11/2017
B          LOC_A        8/22/2017
B          LOC_C        8/25/2017
B          LOC_C        8/26/2017
B          LOC_A        9/2/2017
B          LOC_A        9/3/2017

當我使用DENSE_RANK()OVER(按資產排序,位置)時,得到以下輸出:


ASSET       LOCATION        DATE        ACTUAL
A          LOC_A        9/1/2017        1
A          LOC_A        9/1/2017        1
A          LOC_B        9/5/2017        2
A          LOC_B        9/7/2017        2
A          LOC_A        9/11/2017       1
B          LOC_A        8/22/2017       3
B          LOC_C        8/25/2017       4
B          LOC_C        8/26/2017       4
B          LOC_A        9/2/2017        3
B          LOC_A        9/3/2017        3

但是,我試圖找出一種方法來獲取此處所示的“ EXPECTED”值中的值:


ASSET       LOCATION        DATE        ACTUAL      EXPECTED
A          LOC_A        9/1/2017        1          1
A          LOC_A        9/1/2017        1          1
A          LOC_B        9/5/2017        2          2
A          LOC_B        9/7/2017        2          2
A          LOC_A        9/11/2017       1          3
B          LOC_A        8/22/2017       3          4
B          LOC_C        8/25/2017       4          5
B          LOC_C        8/26/2017       4          5
B          LOC_A        9/2/2017        3          6
B          LOC_A        9/3/2017        3          6

在此方面的任何幫助將不勝感激。


我的SQL是

SELECT ASSET, LOCATION, TXNDATE, 
       DENSE_RANK() OVER (ORDER BY ASSET, LOCATION) AS DENSERANK 
FROM TEMPTABLE 
ORDER BY ASSET, TXNDATE 

是的,我得到上面顯示的“ ACTUAL”結果。

您正在尋找assetlocation變化。 一種方法使用lag()和累積和:

SELECT ASSET, LOCATION, TXNDATE, 
       SUM(CASE WHEN Asset = prev_asset AND location = prev_location THEN 0
                ELSE 1
           END) OVER (ORDER BY TXNDATE) AS DENSERANK 
FROM (SELECT tt.*,
             LAG(ASSET) OVER (ORDER BY TXNDATE) as prev_asset,
             LAG(LOCATION) OVER (ORDER BY TXNDATE ) as prev_location
      FROM TEMPTABLE 
     ) tt
ORDER BY ASSET, TXNDATE;

Oracle默認使用RANGE BETWEEN而不是ROWS BETWEEN 這是您想要的行為,因為您有帶有相同日期的行,並且應該將所有行都視為相同。

暫無
暫無

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

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