慢速自连接的替代方法(oracle sql)

t1rydlwq  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(332)

我正在自联接一个表,以便在同一行上获取日期t和日期t+1月的变量“status”,它们分别保存为“status\u a”和“status\u b”:

select * from 
  (select mydate, id, status status_a from T) A
inner join 
  (select add_months(mydate,1) mydate, id, status status_b from T) B 
using(mydate, id);

我这样做是因为我需要检查一个条件,该条件涉及两个相邻时段中“status”列的值,例如。 status_a in(0,2,4) and status_b in(91,93,95) . 问题是,考虑到表t的大小,这个连接需要很多时间。有没有更有效的方法来做同样的事情?我考虑的可能性:
在一对日期上而不是在整个表t上迭代联接,这可能需要pl/sql语句。
可以在窗口函数中直接合并一个简单的条件;但是,由于我需要检查的条件要求考虑值是否属于值列表(例如。 status_a in(0,2,4) and status_b in(91,93,95) ),则可能无法使用窗口函数获得输出。如果要考虑的两个日期不是相邻的,也不是每个id的“第一个和最后一个”记录,则会产生额外的并发症。
在oraclesql中,您有什么建议可以加快这种自连接的速度吗?

fzwojiic

fzwojiic1#

可以将窗口函数与 range 规范。您现有的查询可以改为:

select
    mydate,
    id,
    status status_a,
    first_value(status) over(
        partition by id
        order by mydate
        range between interval '1' month preceding and interval '1' month preceding
    ) status_b
from t

如果需要,可以在窗口函数中直接添加附加条件,例如:

first_value(case when status in (91,93,95) then status end) over(...)

但如果没有看到实现所需逻辑的实际查询和/或示例数据和所需结果,就无法确定这一点。

相关问题