【问题标题】:speeding up recursive query/ looping through values加速递归查询/遍历值
【发布时间】:2020-04-17 09:13:16
【问题描述】:

假设表的结构如下:

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),它确实很慢。 谢谢

【问题讨论】:

  • 如果不查看您的实际表和索引定义、您的确切查询以及查询执行计划,我不相信您有可能给您任何有意义的建议。
  • 如果你有2000-01-01 12:00:002000-01-01 12:00:002000-01-01 12:00:01怎么办?
  • 第三个值与 pair(id,valid_from) 完全不同,不应该用它做任何事情。

标签: sql db2 recursive-query


【解决方案1】:

如果“下一秒”没有被占用,那么:

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|

【讨论】:

  • 谢谢,试图用 cte 递归过度杀伤它,但似乎解决方案很简单
【解决方案2】:

你可以使用窗口函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-24
    • 2015-05-23
    • 2012-05-25
    • 1970-01-01
    • 2018-07-12
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多