在变量分区更改后重置 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>
子句以获得您需要的结果。请 运行 您的查询在发帖之前先在您的系统上获得这样的订单...
我正在使用 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>
子句以获得您需要的结果。请 运行 您的查询在发帖之前先在您的系统上获得这样的订单...