【问题标题】:Rank records in db2 sql对 db2 sql 中的记录进行排名
【发布时间】: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


【解决方案1】:
SELECT PRODUCT2, LINE2, SCORE,
   CASE WHEN A_ITEM1 IS NULL THEN RANK2 ELSE RANK END AS RANK
FROM (
  SELECT PRODUCT2, LINE2, SCORE,
    A.ITEM1 A_ITEM1,
    ROWNUMBER() OVER (Partition by PRODUCT1 order by A.RANK1 AS  RANK,
    ROWNUMBER() OVER (Partition by PRODUCT2 order by B.SCORE AS  RANK2
  FROM TABLE1 B
  LEFT JOIN TABLE1 A ON A.ITEM1 = B.ITEM2 AND A.PRODUCT1 = B.PRODUCT2
) Z

【讨论】:

  • 由于表 1 中的 MAXRANK,它为表 2 中不可用的产品提供了不正确的排名编号。从问题中您可以看到 9800 和 4352 在表 2 中不可用,但分配给这些行的 maxrank 是 3,4 。它应该是 1,1
  • @ChimbuDurai -- 你的评论毫无意义。你需要给我示例输入和预期输出。您的描述似乎没有意义——请说明您期望的结果。
  • 我已经在问题中添加了示例输入和预期输出..请查看它...注意:并非 table1 中可用的所有行都在 table2 中不可用...新table2 中的行应该以起始编号为 1 而不是 table1 的最大排名数排名
  • @ChimbuDurai -- 好的,我明白了
  • - 上述查询对于 table1 工作正常,但它没有为 table2 中可用的行而不是 table2 提供正确的排名。我附上了输出的截图。黄色突出显示的记录是表 1 和表 2 中可用的记录。并且未突出显示的记录仅在 table2 中可用。排名应该是 1,2,3,4,5,6,7
【解决方案2】:

试试这个:

with t1 as (
select f1.*, rownumber() over(partition by f1.Product1 order by f1.rank1) rank
from table1 f1
),
t2 as (
select f1.*, rownumber() over(partition by f1.Product2 order by f1.score desc) rank
from table2 f1
)
select t2.Product2, ifnull(t1.item2, t2.item2) item2, t2.score, t2.rank as rank 
from t2 left outer join t1 on t1.Product1=t2.Product2 and t1.rank=t2.rank

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多