我正在自联接一个表,以便在同一行上获取日期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中,您有什么建议可以加快这种自连接的速度吗?
1条答案
按热度按时间fzwojiic1#
可以将窗口函数与
range
规范。您现有的查询可以改为:如果需要,可以在窗口函数中直接添加附加条件,例如:
但如果没有看到实现所需逻辑的实际查询和/或示例数据和所需结果,就无法确定这一点。