【发布时间】:2017-06-19 14:03:26
【问题描述】:
我有 2 个如下表,
product1 item1 rank1
1234 XXXX 1
1234 YYYY 2
5678 GGGG 3
5678 HHHH 4
product2 item2 score rank2
1234 XXXX 90 1
1234 ZZZZ 80 2
1234 YYYY 70 3
1234 CCCC 60 4
5678 HHHH 80 1
5678 GGGG 60 2
5678 DHDH 50 3
9800 AAAA 100 1
4352 BBBB 45 1
我需要改变表 2 的输出,如下所示,
product2 item2 score rank2
1234 XXXX 90 1
1234 YYYY 70 2
1234 ZZZZ 80 3
1234 CCCC 60 4
5678 GGGG 60 1
5678 HHHH 80 2
5678 DHDH 50 3
9800 AAAA 100 1
4352 BBBB 45 1
以下 SQL 提供以下输出,
SELECT PRODUCT2,LINE2,SCORE,ROWNUMBER()
OVER (Partition by PRODUCT1 order by A.RANK1 ) RANK
FROM TABLE1 A, TABLE2 B WHERE A.ITEM1= B.ITEM2 AND
A.PRODUCT1 = B.PRODUCT2
UNION ALL
SELECT PRODUCT2,LINE2,SCORE,
ROWNUMBER() OVER (Partition by PRODUCT2 ORDER BY SCORE DESC) RANK
FROM TABLE2 C
WHERE NOT EXISTS (
SELECT * FROM TABLE1 A WHERE A.PRODUCT1 = C.PRODUCT2
AND A.ITEM1= C.ITEM2)
product2 item2 score rank2
1234 XXXX 90 1
1234 YYYY 70 2
1234 ZZZZ 80 1
1234 CCCC 60 2
5678 GGGG 60 1
5678 HHHH 80 2
5678 DHDH 50 1
9800 AAAA 100 1
4352 BBBB 45 1
table1 中不可用的行在比较 table2 之后没有获得增量排名,而是他们获得了从 1 开始的新排名。有人可以看看这个并告诉我如何实现db2 中的预期结果?
输入:
表一:
Product1 item1 rank1
12345 Xxxx 1
12345 yyyyy 2
12345 Cccc 3
67890 Aaaa 4
表2:
Product2. Item2 score rank2
12345 Bbbb 90 1
12345 yyyyy 80 2
12345 Xxxx 70 3
12345 Cccc 60 4
67890 Aaaa 95 1
67890 Bbbb 85 2
56789 Ghsg 67 1
45377 Hhhh 70 1
预期输出:
Product2. Item2. Score. Rank
12345 Xxxx 70 1
12345 yyyyy 80 2
12345 Cccc 60 3
12345 Bbbb 90 4
67890 Aaaa 95 1
67890 Bbbb 85 2
56789 Ghsq 67 1
45377 Hhhh 70 1
【问题讨论】:
-
请解释您想用于排名的逻辑。从示例数据中看不出来。
-
1.表 1 中的记录应按相同顺序排列 2. 表 2 中不可用的行应根据分数 3 进行排名。如果表 1 有 xxxx,yyyy 之类的记录,而表 2 有 xxxx,yyyy,zzzz 之类的项目,则排名应该是 xxxx 1, yyyy 2, zzzz 3
-
。 .这比看起来要难。如果您只是替换第一个或最后一个排名,那会更简单一些。问题是某一行的新排名会影响其他行。
-
您正在代码中对名为“LINE1”和“LINE2”的列进行连接,但这些不在您的示例表中。 (我觉得应该是“ITEM”?
-
是的,这些是 item1 = item2。现在已更正,但我仍无法达到预期的输出。
标签: sql db2 rank dense-rank