2017-06-12 45 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-是它的作品,但产品编号在所有行中都不相同。我已经用更多的细节更新了问题中的表格值。能否请你看看它...... –