SQL:对多列 Rollup 的部分进行单独排名

SQL: Ranking Sections separately of a Rollup over multiple columns

我尝试对多个列进行汇总,然后对汇总过程的每个 stage/section 应用排名。结果应类似于以下内容:

| 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       |
|------|------|------|-----------------|---------|

所以你可以看到每个分组集都有自己的排名。

基本的 Rollup-Query 很简单,但是排名让我很头疼,我运行不知道如何实现这个。

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

问题是我不能在 (Partition by ...) 上使用普通的 Rank(),因为没有我可以使用的分区可以解决整个问题。

我想这会产生你想要的结果:

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 的分区适用于所有组。这就是为什么这里使用三个 case 语句。