2017-09-11 136 views
1

我試圖在Oracle中使用DENSE_RANK()函數作爲將任意「主鍵」連接到唯一數據分組的方式。我的數據集是過去幾天在不同「地點」針對不同「資產」執行的交易清單。數據集由ASSET ASC,DATE ASC預先訂購,如下所示。Oracle DENSE_RANK()


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(ORDER BY資產,位置),我得到下面的輸出:


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 

不過,我試圖找出一種方式來獲得價值在這裏顯示的「預期」值:


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 

,是的,我正在上面顯示的 「實際」 的結果。

+0

你不應該得到這樣的結果。你確定你沒有使用'PARTITION BY'嗎? – Lamak

+0

我的SQL是SELECT ASSET,LOCATION,TXNDATE,DENSE_RANK()OVER(ORDER BY ASSET,LOCATION)as DENSERANK TEMPTABLE ORDER BY ASSET,TXNDATE和yes,我得到上面顯示的「ACTUAL」結果。 – Nathan

回答

0

您正在尋找有關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; 

甲骨文默認爲RANGE BETWEEN而非ROWS BETWEEN。這是你想要的行爲,因爲你有具有相同日期的行,並且他們都應該被視爲相同。

+0

這是Oracle解決方案嗎?按照原樣使用你的SQL,由於「RANGE BETWEEN UNBOUNDED AND CURRENT ROW」子句,我得到一個語法錯誤。範圍內的數據庫是Oracle 11g。 – Nathan

+0

沒關係,當我刪除「RANGE BETWEEN UNBOUNDED AND CURRENT ROW」子句查詢工作正常並返回結果。這與我的期望值不一樣,但它確實爲ASSET/LOCATION中的每個獨特變化提供了一個獨特的值,這正是我所期待的。謝謝! – Nathan

+0

@Nathan。 。 。無論如何,'RANGE BETWEEN'是Oracle的默認值,所以不需要。 –