我试图从结果表中检索最大值,最小值和第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
)
由于
答案 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