SQL在表

时间:2017-08-29 09:11:56

标签: sql oracle greatest-n-per-group

我有一个表,我需要运行一个包含一些聚合函数的查询,如Maximum,Average,Standard Deviation,... 但不是一个最大值我应该返回5个最大数字。

简化查询是这样的:

SELECT OSI_KEY , MAX(VALUE) , AVG(VALUE) , STDDEV(VALUE), variance(VALUE) 
FROM DATA_VALUES_5MIN_6_2013
GROUP BY OSI_KEY
ORDER BY OSI_KEY

我需要一些神奇的;)这样的查询:

    SELECT OSI_KEY , MAX1(VALUE) ,MAX2(VALUE) ,MAX3(VALUE) ,MAX4(VALUE) , MAX5(VALUE) ,
    AVG(VALUE) , STDDEV(VALUE), variance(VALUE) 
    FROM DATA_VALUES_5MIN_6_2013
    GROUP BY OSI_KEY
    ORDER BY OSI_KEY

感谢您的考虑。

2 个答案:

答案 0 :(得分:2)

Oracle具有NTH_VALUE()功能。不幸的是,它只是一个分析函数而不是窗口函数。这导致SELECT DISTINCT的奇怪结构带有一堆分析函数:

SELECT DISTINCT OSI_KEY,
       MAX(VALUE) OVER (PARTITION BY OSI_KEY),
       NTH_VALUE(VALUE, 2) OVER (PARTITION BY OSI_KEY ORDER BY VALUE DESC) as MAX_2,
       NTH_VALUE(VALUE, 3) OVER (PARTITION BY OSI_KEY ORDER BY VALUE DESC) as MAX_3,
       NTH_VALUE(VALUE, 4) OVER (PARTITION BY OSI_KEY ORDER BY VALUE DESC) as MAX_4,
       NTH_VALUE(VALUE, 5) OVER (PARTITION BY OSI_KEY ORDER BY VALUE DESC) as MAX_5,
       AVG(VALUE) OVER (PARTITION BY OSI_KEY),
       STDDEV(VALUE)  OVER (PARTITION BY OSI_KEY),
       variance(VALUE)  OVER (PARTITION BY OSI_KEY)
FROM DATA_VALUES_5MIN_6_2013
ORDER BY OSI_KEY;

您也可以使用条件聚合,在子查询中使用row_number()dense_rank()来执行此操作。

答案 1 :(得分:0)

SELECT OSI_KEY, MaxValue FROM (
    SELECT OSI_KEY, MAX(value) AS MaxValue FROM table GROUP BY OSI_KEY
)
ORDER BY MaxValue DESC
FETCH FIRST 5 ROWS ONLY;