Как изменить порядок столбца DENSE_RANK с учетом нескольких столбцов в Oracle? - PullRequest
3 голосов
/ 21 октября 2019

У меня есть следующий запрос, в котором есть столбцы 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. Заранее спасибо.

1 Ответ

4 голосов
/ 21 октября 2019

Похоже, вы просто хотите, чтобы столбец 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;

screen capture of above SQL query

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...