SQL: ранжирование разделов отдельно для свертки по нескольким столбцам

Я пытаюсь сделать сведение по нескольким столбцам, а затем применить ранжирование на каждой стадии / разделе процесса свертки. Результат должен выглядеть примерно так:

| ColA | ColB | ColC | RankingCriteria | Ranking |
|------|------|------|-----------------|---------|
| -    | -    | -    | 10              | 1       |
|------|------|------|-----------------|---------|
| A    | -    | -    | 10              | 1       |
| B    | -    | -    | 8               | 2       |
|------|------|------|-----------------|---------|
| A    | a    | -    | 9               | 1       |
| A    | b    | -    | 7               | 2       |
| A    | c    | -    | 5               | 3       |
| A    | d    | -    | 2               | 4       |
|------|------|------|-----------------|---------|
| B    | a    | -    | 8               | 1       |
| B    | c    | -    | 7               | 2       |
| B    | b    | -    | 2               | 3       |
|------|------|------|-----------------|---------|
| A    | a    | x    | 7               | 1       |
| A    | a    | y    | 5               | 2       |
| A    | a    | z    | 4               | 3       |
|------|------|------|-----------------|---------|
| A    | b    | y    | 6               | 1       |
|------|------|------|-----------------|---------|
| A    | c    | w    | 10              | 1       |
| A    | c    | y    | 10              | 1       |
| A    | c    | z    | 8               | 2       |
| A    | c    | x    | 6               | 3       |
|------|------|------|-----------------|---------|
| A    | d    | y    | 4               | 1       |
|------|------|------|-----------------|---------|
| B    | a    | w    | 10              | 1       |
| B    | a    | x    | 8               | 2       |
|------|------|------|-----------------|---------|
| B    | b    | y    | 6               | 1       |
| B    | b    | z    | 5               | 2       |
| B    | b    | w    | 4               | 3       |
|------|------|------|-----------------|---------|
| B    | c    | x    | 6               | 1       |
|------|------|------|-----------------|---------|

Итак, как вы можете видеть, каждый набор групп имеет свой рейтинг.

Основной накопительный запрос для этого прост, но рейтинг вызывает у меня головную боль, и у меня заканчиваются идеи о том, как этого добиться.

Select ColA, ColB, ColC, RankingCriteria
From table
Group By Rollup(ColA, ColB, ColC)

Проблема в том, что я не могу использовать обычный метод Rank() over (Partition by ...), потому что нет ни одного раздела, который бы я мог использовать, который бы работал в целом.

1 ответ

Решение

Я думаю, что это будет производить то, что вы хотите:

SELECT r.*,
       row_number() over (partition by (case when colb is null and colc is null and cola is not null
                                             then 1 else 0 end),
                                       (case when colb is null and colc is null and cola is not null
                                             then NULL else A end),
                                       (case when colb is null and colc is null and cola is not null
                                             then NULL else B end)
                         order by RankingCriteria desc) as seqnum                           
FROM (Select ColA, ColB, ColC, RankingCriteria
      From table
      Group By Rollup(ColA, ColB, ColC)
     ) r;

То, как я читаю логику, состоит в том, что разбиение по A и B работает для всех, кроме второй группы. Вот почему здесь используются три случая.

Другие вопросы по тегам