如何在 Oracle 中考虑多个列对 DENSE_RANK 列重新排序?

Naf*_*tha 3 sql oracle

我有一个查询,其中有 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;
Run Code Online (Sandbox Code Playgroud)

查询结果为:

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
Run Code Online (Sandbox Code Playgroud)

但确实想像这样对 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
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*sen 6

看起来您只是希望该DRN列成为按SL_NO列排序的密集排名。我们可以子查询一次,并任意取SL_NO每个帐户的最小值,然后使用密集排名:

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;
Run Code Online (Sandbox Code Playgroud)

上述 SQL 查询的屏幕截图

演示