2017-08-29 4 views
2

テーブルがあり、最大、平均、標準偏差などの集計関数を含むクエリを実行する必要があります。 最大5つの番号を返します。SQL 1つではなく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 

は、私はあなたの配慮に感謝。

+0

あなたは値の降順で注文した後、 "Select Top 5 ..."を試すことができます – 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

Lamarありがとうございます。しかし、あなたの質問は5つのレコードで5つの最大値を返します。しかし、私が必要とするのは、お互いに5つの最大値であり、 ...)。 – MohsenCs

関連する問題