加速递归查询/遍历值

speeding up recursive query/ looping through values

假设 table 的结构如下:

create table tab1
(
id int,
valid_from timestamp
)

我需要构建查询,以防对 (id,valid_from) 出现口是心非,例如

id    valid_from
1     2000-01-01 12:00:00
1     2000-01-01 12:00:00

然后需要将一秒添加到 valid_from 列的后续行。 例如,如果有三个重复的行,结果应该如下

id    valid_from
1     2000-01-01 12:00:00
1     2000-01-01 12:00:01
1     2000-01-01 12:00:02

尝试了 运行 递归 cte 查询,但由于在某些情况下存在大量重复值(对于 (id,valid_from) 的某些情况,当前数据集大约有 160 个),它真的很慢。 谢谢

您可以使用 window 函数:

select id,
       valid_from + (row_number() over (partition by id order by valid_from) - 1) second
from t;

如果"next second"没有被占用,那么:

WITH TAB (id, valid_from) AS 
(
VALUES
  (1, TIMESTAMP('2000-01-01 12:00:00'))
, (1, TIMESTAMP('2000-01-01 12:00:00'))
, (1, TIMESTAMP('2000-01-01 12:00:00'))

, (2, TIMESTAMP('2000-01-01 12:00:00'))
, (2, TIMESTAMP('2000-01-01 12:00:01'))
, (2, TIMESTAMP('2000-01-01 12:00:01'))
)
SELECT ID, VALID_FROM
, VALID_FROM + (ROWNUMBER() OVER (PARTITION BY ID, VALID_FROM) - 1) SECOND AS VALID_FROM2
FROM TAB
ORDER BY ID, VALID_FROM2;

结果是:

|ID         |VALID_FROM                |VALID_FROM2               |
|-----------|--------------------------|--------------------------|
|1          |2000-01-01-12.00.00.000000|2000-01-01-12.00.00.000000|
|1          |2000-01-01-12.00.00.000000|2000-01-01-12.00.01.000000|
|1          |2000-01-01-12.00.00.000000|2000-01-01-12.00.02.000000|
|2          |2000-01-01-12.00.00.000000|2000-01-01-12.00.00.000000|
|2          |2000-01-01-12.00.01.000000|2000-01-01-12.00.01.000000|
|2          |2000-01-01-12.00.01.000000|2000-01-01-12.00.02.000000|