2014-06-06 9 views
1

Я пытаюсь получить max, min и 90-й процентили из таблицы результатов. Я хочу 90-й процентиль для продолжительности на основе timestamp_ в порядке возрастания.Функция SQL Percile и объединение двух запросов:

Моей таблица выглядит следующим образом:

TIMESTAMP_    DURATION 
24/01/2000 12:04:45.120  454 
26/10/200 12:13:49.440  301 
06/01/2001 15:12:05.760  245 
23/01/2001 10:56:55.680  462 
16/02/2001 12:10:39.360  376 
19/04/2001 09:22:45.120  53 
13/05/2001 12:36:34.560  330 
30/05/2001 14:47:45.600  796 
07/08/2001 08:51:47.520  471 
25/08/2001 14:24:08.640  821 

У меня есть 2 запросов retrive этой информации, но есть более простое решение с помощью одного запроса. вот мои запросы:

Select MIN(DURATION), MAX(DURATION) 
From t 
    ; 


    Select DURATION as nthPercentile from t 
    Where TIMESTAMP_ = 
    (
    Select 
    Percentile_disc(0.90) within group (order by TIMESTAMP_) AS nth 
    From t 
    ) 

Благодаря

+0

Tag обновляется с Oracle. Спасибо – user3715596

ответ

0

Вы можете использовать аналитику:

SQL> SELECT duration, max_duration, min_duration 
    2 FROM (SELECT duration, ts, 
    3     Percentile_disc(0.90) within GROUP(ORDER BY ts) OVER() nth, 
    4     MAX(duration) OVER() max_duration, 
    5     MIN(duration) OVER() min_duration 
    6    FROM t) 
    7 WHERE ts = nth; 

    DURATION MAX_DURATION MIN_DURATION 
---------- ------------ ------------ 
     471   821   53 

Однако, я не совсем уверен, что это результат, который вы хотите. Почему вы хотите заказать по метке? Результирующая длительность - это продолжительность 90-й процентной строки на основе временной отметки, а не длительности.

Более простой и логический результат может быть то, что вам нужно:

SQL> SELECT Percentile_disc(0.90) WITHIN GROUP(ORDER BY duration) nth, 
    2   MAX(duration) max_duration, 
    3   MIN(duration) min_duration 
    4 FROM t; 

     NTH MAX_DURATION MIN_DURATION 
---------- ------------ ------------ 
     796   821   53 
+0

Прямой запрос дал мне 90-й процентиль продолжительности, но запрос выше сделал трюк. Спасибо – user3715596

+0

Извините, есть ли способ получить 90-е и 95-е место в одном запросе? – user3715596

1

Вот один подход:

Select MAX(case when TIMESTAMP_ = nth then DURATION end) as nthPercentile, 
     MAX(MAXDUR) as MAXDUR, MAX(MINDUR) as MINDUR 
from (Select DURATION, TIMESTAMP_, MIN(DURATION) as MINDUR, MAX(DURATION) as MAXDUR 
      Percentile_disc(0.90) within group (order by TIMESTAMP_) AS nth 
     from t 
    ) tsum join 
    t 
    on t.TIMESTAMP_ = tsum.TIMESTAMP_; 
+0

Я получаю ORA-00937: не групповая функция с групповой функцией с этим запросом – user3715596

+0

@ user3715596. , , Да. Пределы продолжительности должны быть рассчитаны в подзапросе. Основная идея заключается в перемещении вычисления процентиля в предложение 'from' из предложения' where'. –

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