用分析函数替换自联接

时间:2010-03-19 10:26:03

标签: oracle analytic-functions

如何使用分析替换以下自加入:

SELECT 
t1.col1 col1,
t1.col2 col2,
SUM((extract(hour FROM (t1.times_stamp - t2.times_stamp)) * 3600 + extract(minute FROM ( t1.times_stamp - t2.times_stamp)) * 60 + extract(second FROM ( t1.times_stamp - t2.times_stamp)) ) ) div,
COUNT(*) tot_count
FROM tab1 t1,
tab1 t2
WHERE t2.col1      = t1.col1
AND t2.col2  = t1.col2
AND t2.col3        = t1.sequence_num
AND t2.times_stamp     < t1.times_stamp
AND t2.col4         = 3
AND t1.col4         = 4
AND t2.col5 NOT IN(103,123)
AND t1.col5     != 549
GROUP BY t1.col1, t1.col2

2 个答案:

答案 0 :(得分:1)

我很确定您无法使用分析替换自联接,因为您正在使用行间操作(t1.time_stamp - t2.time_stamp)。 Analytics只能访问当前行的值和行子集上的聚合函数的值(窗口子句)。

有关分析限制的进一步分析,请参阅this article from Tom Kytethis paper

答案 1 :(得分:0)

几乎看起来你可以消除t2上的自我加入并替换

t1.time_stamp - t2.time_stamp

类似

t1.time_stamp - lag(t1.time_stamp) over (partition by col1, col2 order by time_stamp)

col4和col5上的t1t2上的不同过滤器会阻止您这样做。
分析函数在主查询的where / group by之后应用,因此您需要在t1上使用单个过滤器,以便使用lag / lead来指定序列中的后续行或前一行。

此外,您需要将sum / group按推送到外部查询以在分析函数之后进行聚合:

select col1, col2, sum(timestamp_diff) from (
  select col1, col2, timestamp - lag(timestamp) over(.....) as timestamp_diff
  where ....
) group by col1, col2