在变量分区更改后重置 dense_rank 或 row_number 中的索引

reset index in dense_rank or row_number after variable partitioning over changes

我正在使用 DB2 SQL。我有以下内容:

select * from mytable order by Var,Varseq

ID    Var    Varseq
--    ---    ------
1     A      1
1     A      2
1     B      1
1     A      3
2     A      1
2     C      1

但想得到:

ID    Var    Varseq    NewSeq
--    ---    ------    ------
1     A      1         1
1     A      2         2
1     B      1         1
1     A      3         1
2     A      1         1
2     C      1         1

然而 dense_rank 产生与原始结果相同的结果。我希望你能看到所需输出的差异 - 在第 4 行,当 ID=1 returns 到 Var=A 时,我希望索引重置为 1,而不是继续为 3。即我想要每次给定 ID 的 Var 更改时要重置的索引。

参考这里是我的查询:

SELECT *, DENSE_RANK() OVER (PARTITION BY ID, VAR ORDER BY VARSEQ) FROM MYTABLE

这是一个缺口和孤岛问题的例子。但是,SQL 个表表示 个无序 个集合。如果没有指定整体排序的列,您的问题就没有意义。

在这种情况下,行号的差异将满足您的要求。但是您需要一个整体排序栏:

select t.*,
       row_number() over (partition by id, var, seqnum - seqnum2 order by <ordering col>) as newseq
from (select t.*,
             row_number() over (partition by id order by <ordering col>) as seqnum,
             row_number() over (partition by id, var order by <ordering col>) as seqnum2
      from t
     ) t

还没有答案,只是为了有更好的格式。

WITH TAB (ID, Var, Varseq) AS 
(
VALUES
  (1, 'A', 1)
, (1, 'A', 2)
, (1, 'A', 3)
, (1, 'B', 1)
, (2, 'A', 1)
, (2, 'C', 1)
)
SELECT *
FROM TAB
ORDER BY ID, <order keys>;

您在上面的查询中将 Var, Varseq 指定为 <order keys>。 结果是:

|ID         |VAR|VARSEQ     |
|-----------|---|-----------|
|1          |A  |1          |
|1          |A  |2          |
|1          |A  |3          |
|1          |B  |1          |
|2          |A  |1          |
|2          |C  |1          |

但是根据你的问题,你需要的是:

|ID         |VAR|VARSEQ     |
|-----------|---|-----------|
|1          |A  |1          |
|1          |A  |2          |
|1          |B  |1          |
|1          |A  |3          |
|2          |A  |1          |
|2          |C  |1          |

因此,请编辑您的问题以指定这样的 <order keys> 子句以获得您需要的结果。请 运行 您的查询在发帖之前先在您的系统上获得这样的订单...