加速递归查询/遍历值
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|
假设 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|