【问题标题】:How to reorder a DENSE_RANK column considering multiple columns in Oracle?考虑到 Oracle 中的多个列,如何重新排序 DENSE_RANK 列?
【发布时间】:2020-02-17 05:17:51
【问题描述】:

我有一个查询,其中包含 DENSE_RANK 和 ROW_NUMBER 列:

WITH CTE AS(
    SELECT
    A.SL_NO, 
    A.ACC_NO, 
    A.ACC_NAME
    DENSE_RANK() OVER(ORDER BY A.ACC_NO, A.ACC_NAME) DRN,
    ROW_NUMBER() OVER(PARTITION BY A.ACC_NO, A.ACC_NAME ORDER BY A.SL_NO) RN
    FROM TEST_TBL A 
)
SELECT * 
FROM CTE A
ORDER BY A.SL_NO;

查询结果:

SL_NO   ACC_NO  ACC_NAME DRN RN
1        234      UNIP    3   1
2        234      UNIP    3   2
3        234      UNIP    3   3
4        256      PURP    4   1
5        256      PURP    4   2
6        289      KFAR    5   1
7        210      FHAS    2   1
8        210      FHAS    2   2
9        210      FHAS    2   3
10       110      PURP    1   1
11       110      PURP    1   2
12       110      PURP    1   3
13       110      PURP    1   4

但是想要这样排序 DRN 列(排名必须根据 acc_no 和 acc_name 列):

SL_NO   ACC_NO  ACC_NAME DRN RN
1        234      UNIP    1   1
2        234      UNIP    1   2
3        234      UNIP    1   3
4        256      PURP    2   1
5        256      PURP    2   2
6        289      KFAR    3   1
7        210      FHAS    4   1
8        210      FHAS    4   2
9        210      FHAS    4   3
10       110      PURP    5   1
11       110      PURP    5   2
12       110      PURP    5   3
13       110      PURP    5   4

需要建议以使用或不使用 DENSE_RANK 来实现它。提前致谢。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您似乎只希望DRN 列是由SL_NO 列排序的密集等级。我们可以子查询一次,任意取每个账户的最小SL_NO值,然后使用dense rank:

    WITH cte AS (
        SELECT
            SL_NO, 
            ACC_NO, 
            ACC_NAME,
            ROW_NUMBER() OVER(PARTITION BY ACC_NO, ACC_NAME ORDER BY SL_NO) RN,
            MIN(SL_NO) OVER (PARTITION BY ACC_NO, ACC_NAME) AS SL_NO_MIN
        FROM TEST_TBL A
    )
    
    SELECT
        SL_NO, 
        ACC_NO, 
        ACC_NAME,
        DENSE_RANK() OVER (ORDER BY SL_NO_MIN) AS DRN,
        RN
    FROM cte
    ORDER BY
        SL_NO;
    

    Demo

    【讨论】:

    • 有效!谢谢...不知道聚合函数也适用于 over 和 partition...
    • 记住:Windows 函数总是在查询中运行last(嗯……也许ORDER BY 除外)。因此,如果您有一个 GROUP BY 查询并使用窗口函数,则窗口函数将在 GROUP BY 之后计算,并且您只能引用其中的聚合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2014-08-31
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多