增加具有重复组的组的行号

时间:2017-11-30 10:00:20

标签: sql oracle group-by dense-rank

我正在研究PLSQL(Oracle 12)的查询,其中我需要增加每个组的数据集的行号。

我的问题类似于这个问题(Increment Row Number on Group)。但是,我的情况略有不同。我在数据上重复了相同的 shade ,我希望在分组时保留原始顺序。

以下数据

Level | Shade
-------------
1     | A
2     | A
3     | A
4     | B
5     | B
6     | B
7     | A
8     | A
9     | A

我想得到以下结果

Group | Shade | Amount
----------------------
1     | A     | 3
2     | B     | 3
3     | A     | 3

如果我使用 Shade 的DENSE_RANK函数排序,我无法保留原始订单,这就是我得到的:

Group | Shade | Amount
----------------------
1     | A     | 6
2     | B     | 3

分组时如何保留原始组模式?

1 个答案:

答案 0 :(得分:2)

您可以使用行号的差异来定义组:

select Shade, count(*) as amount
from (select t.*,
             row_number() over (order by level) as seqnum,
             row_number() over (partition by shade order by level) as seqnum_s
      from t
     ) t
group by Shade, (seqnum - seqnum_s);

有点难以解释为什么会这样。如果查看子查询的结果,很明显为什么两个row_number()值之间的差异可以识别顺序组。