【发布时间】:2015-06-02 06:58:32
【问题描述】:
给定这样的表(dt 列是唯一的):
id | dt | days_count
------------------------------
1 | 2015-06-01 | NULL
2 | 2015-06-03 | NULL
4 | 2015-06-09 | NULL
我需要计算最近日期之间的间隔天数并更新列days_count 中的检索结果,并且计算必须从最新日期开始。也就是说,需要的结果是:
id | dt | days_count
------------------------------
1 | 2015-06-01 | NULL
2 | 2015-06-03 | 2
4 | 2015-06-09 | 6
为此我有 2 个变体:
- 变体 1
使用PL/SQL FOR (SELECT ..) LOOP,获取按dt desc 排序的每一行,并计算当前行日期与前一行日期之间的间隔天数。
-
变体 2
MERGE INTO mytable USING( WITH t1 as (SELECT id, dt, row_number() over(order by dt) as rn from mytable), t2 as (SELECT id, dt, row_number() over(order by dt) + 1 as rn from mytable) SELECT t1.id, t1.rn, t1.dt - t2.dt as days_count from t1 left JOIN t2 on t1.rn = t2.rn ) day_interval ON (mytable.id = day_interval.id) WHEN MATCHED THEN UPDATE SET mytable.days_count= day_interval.days_count
这些变体有效,但问题是:也许有更有效的方法?
【问题讨论】: