【问题标题】:Using RANK() to assign a rank based on multiple criteria in Oracle使用 RANK() 根据 Oracle 中的多个条件分配排名
【发布时间】:2021-11-20 19:58:38
【问题描述】:

我有一个类似的表:

Item Class Qty Loc
Apple Fruit1 1 N
Apple Fruit1 1 NW
Apple Fruit2 0 W
Apple Fruit3 1 N
Orange Fruit1 10 SE
Orange Fruit2 1 SW

我正在尝试查询所有Class 最小的行,每个Item 具有最小的非零 Qty。因此,如果相同的Item 对多个类具有相同的Qty,它将选择最低的Class (Fruit1 Fruit2 Fruit3

SELECT A.*, 
RANK() OVER(
PARTITION BY ITEM, CLASS
ORDER BY QTY ASC, CLASS ASC) AS item_rank
FROM fruits.info
WHERE QTY <> 0

获得排名来选择,这是行不通的。排名结果应该是:

Item Class Qty Loc item_rank
Apple Fruit1 1 N 1
Apple Fruit1 1 NW 1
Apple Fruit3 1 N 2
Orange Fruit1 10 SE 2
Orange Fruit2 1 SW 1

然后我会为item_rank = 1 使用嵌套选择:

SELECT B.* FROM (
    SELECT A.*, 
    RANK() OVER(
    PARTITION BY ITEM, CLASS
    ORDER BY QTY ASC, CLASS ASC) AS item_rank
    FROM fruits.info
) B
WHERE B.item_rank = 1

要得到最终结果,应该是:

Item Class Qty Loc item_rank
Apple Fruit1 1 N 1
Apple Fruit1 1 NW 1
Orange Fruit2 1 SW 1

我如何构建我的RANK() 以实现这一目标?有没有更有效的方法?

【问题讨论】:

    标签: oracle ranking-functions


    【解决方案1】:

    class 只能用于排序,不能用于分区。您需要每个 item 的排名,而不是每一对 itemclass

    您尝试中的(易于修复)错误是在partition byorder by 中都包含class;如果您考虑一下,那永远没有意义:如果您按某物进行分区,则按它进一步排序(在每个分区中,“它”是恒定的)没有意义。从partition by 中删除class,你应该得到你需要的。

    【讨论】:

    • 感谢您的解释,这很有意义且有效!
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多