2017-06-12 93 views
1

我有2個表格,如下所示的排名不正確。是否可以比較這兩個表之間的數據,並根據第一個表中可用的數據對其進行排名,並將第一個表中的不可用記錄排序在該值中。更新中的RANK()函數sql

表1:

PRODUCT1 LINE1  RANK1 
12345  XXXX   1 
12345  YYYY   2 
12345  ZZZZ   3 
34556  GGGG   1 

目前具有以下輸出我的表2

表2:

PRODUCT2 LINE2 SCORE RANK2 
12345 GGGG 100 1 
12345 JJKJ 90  2 
12345 WEJJ 80  3 
12345 CCCC 70  4 
12345 XXXX 60  5 
12345 YYYY 50  6 
12345 ZZZZ 40  7 
34556 AAAA 90  1 
34556 GGGG 80  2 
34556 HHHH 90  3 
34556 FFFF 80  4 

我更新後期待我的表2輸出如下

PRODUCT2 LINE2 SCORE RANK2 
12345 XXXX 70 1 
12345 YYYY 50 2 
12345 ZZZZ 40 3 
12345 GGGG 100 4 
12345 JJKJ 90 5 
12345 WEJJ 80 6 
12345 CCCC 70 7 
34556 GGGG 80 1 
34556 HHHH 90 2 
34556 FFFF 80 3 
34556 AAAA 90 4 

查詢輸出是像下面,

PRODUCT2 LINE2 SCORE RANK2 
12345 XXXX 70 1 
12345 YYYY 50 2 
12345 ZZZZ 40 3 
12345 GGGG 100 4 
12345 JJKJ 90 5 
12345 WEJJ 80 6 
12345 CCCC 70 7 
34556 GGGG 80 1 
34556 HHHH 90 8 
34556 FFFF 80 9 
34556 AAAA 90 10 

由於(SELECT MAX(RANK)FROM TEMP)在應答所花費的最大秩從臨時無關的產品編號和分配最大數量爲秩爲其餘產品。在這種情況下,7是在產品1的最大秩數,因此在表中的排名分配爲8,9,10的不可用線2

+0

你真的在使用DB2和Oracle嗎? –

+0

我正在使用DB2,刪除了不正確的oracle標記。 –

回答

0

在這裏你去

WITH TEMP AS (             
    SELECT B.PRODUCT2,             
    B.LINE2, B.SCORE,             
    ROW_NUMBER() OVER() RANK           
    FROM TABLE1 A, TABLE2            
    B WHERE A.PRODUCT1 = B.PRODUCT2 AND A.LINE1 = B.LINE2    
)                 
SELECT * FROM TEMP 
UNION           
SELECT PRODUCT2, LINE2, SCORE, 
    ROW_NUMBER() OVER() + (SELECT MAX(RANK) FROM TEMP) RANK   
FROM TABLE2 C              
WHERE NOT EXISTS (            
    SELECT * FROM TABLE1 WHERE PRODUCT1 = C.PRODUCT2 AND LINE1 = C.LINE2 
    ) 
ORDER BY RANK              

添加答案基於變革問題


如果您有不同的產品,那麼使用rownumber對它們進行排名時,請使用分區。這將排在「分區」內,在你的情況下是產品。

WITH TEMP AS (             
    SELECT B.PRODUCT2,           
    B.LINE2, B.SCORE,            
    ROW_NUMBER() OVER (Partition by PRODUCT2) RANK    
    FROM TABLE1 A, TABLE2           
    B WHERE A.PRODUCT1 = B.PRODUCT2 AND A.LINE1 = B.LINE2   
)                 
SELECT * FROM TEMP            
UNION                
SELECT PRODUCT2, LINE2, SCORE,         
    ROW_NUMBER() OVER (Partition by PRODUCT2)      
+ (SELECT MAX(RANK) FROM TEMP where temp.product2 = C.product2) RANK        
FROM TABLE2 C              
WHERE NOT EXISTS (            
    SELECT * FROM TABLE1 WHERE PRODUCT1 = C.PRODUCT2 AND LINE1 = 
C.LINE2 )              
ORDER BY product2 , RANK           
+0

感謝上述解決方案,您可以添加完整的SQL嗎?看起來像部分。 –

+0

@ChimbuDurai沒有它的不完整,創建類似的表後,我在我的數據庫中運行 – uSeruSher

+0

@ uSeruSher-是它的作品,但產品編號在所有行中都不相同。我已經用更多的細節更新了問題中的表格值。能否請你看看它...... –