2010-03-19 2 views
1

Как идти о замене следующей автообъединение с помощью аналитика:Заменить selfjoin с аналитическими функциями

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 

ответ

1

Я уверен, что вы не сможете заменить selfjoin с аналитикой, потому что вы используя операции между строками (t1.time_stamp - t2.time_stamp). Аналитика может получать доступ только к значениям текущей строки и значения агрегатных функций по подмножеству строк (предложение windowing).

См. this article from Tom Kyte и this paper для дальнейшего анализа ограничений аналитики.

0

Это почти выглядит, как вы могли бы устранить автообъединение на t2 и заменить

t1.time_stamp - t2.time_stamp

с чем-то вроде

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

Различные фильтры t1 и t2 на COL4 и col5 - это то, что мешает вам это делать.
Аналитические функции применяются после того, как/group по основному запросу, поэтому вам нужно будет иметь один фильтр на t1, чтобы использовать lag/lead для указания следующих или предыдущих строк в последовательности.

Кроме того, вам нужно нажать на сумму/группу, к внешнему запросу агрегировать после аналитической функции:

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

 Смежные вопросы

  • Нет связанных вопросов^_^