2017-08-29 75 views
2

我有一個表,我需要運行一個包含像最大值,平均值,標準差,... 一些聚合函數的查詢,但不是一個最大我應該返回5個最大的數字。SQL查找五大數字而不是一個最大的表

簡化的查詢是這樣的:

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 

我很欣賞你的考慮。

+0

你可以試試「選擇前5個......」後面的查詢順序按值decending – Lee

回答

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()

+0

不是函數'NTH_VALUE'的名字? –

+0

@RadimBača。 。 。謝謝。 –

+0

謝謝@RadimBača,它非常有幫助。我真的很感激。 – MohsenCs

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; 
+0

如何使用GROUP BY結合後OSI_KEY? – jarlh

+0

對不起,錯過了,檢查 – Lamar

+0

謝謝拉馬爾更新的組,但您的查詢只返回五個記錄的五個最大的數字,但我需要的是其他agrigation函數(AVG,方差旁邊對方,他們身邊五個最大限度, ...)。 – MohsenCs