SQL百分位函数和加入2个查询:

时间:2014-06-06 15:16:41

标签: sql oracle

我试图从结果表中检索最大值,最小值和第90百分位数。 我希望基于asc顺序的timestamp_持续时间为第90个百分位数。

我的表格如下:

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个查询来检索此信息,但使用一个查询是否有更简单的解决方案。这是我的疑问:

 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
    )

由于

2 个答案:

答案 0 :(得分: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_;

答案 1 :(得分: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