[英]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”結果。
您正在尋找asset
和location
變化。 一種方法使用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.