2017-08-29 1 views
2

J'ai une table et j'ai besoin d'exécuter une requête qui contient des fonctions d'agrégation comme le maximum, la moyenne, la déviation standard, ... mais au lieu d'un maximum je devrais retour 5 plus grand nombre.SQL Trouver les cinq plus grands nombres au lieu d'un maximum dans un tableau

la requête simplifiée est quelque chose comme ceci:

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 

et j'ai besoin magique;) requête comme ceci:

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 

Je vous remercie de vos considérations.

+0

vous pouvez essayer "Select Top 5 ..." suivi de votre requête après l'ordre par la valeur décisive – Lee

Répondre

2

Oracle a une fonction NTH_VALUE(). Malheureusement, ce n'est qu'une fonction analytique et non une fonction de fenêtre. Cela conduit à la construction étrange SELECT DISTINCT avec un tas de fonctions analytiques:

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; 

Vous pouvez aussi le faire en utilisant l'agrégation conditionnelle, avec un row_number() ou dense_rank() dans une sous-requête.

+0

n'est pas le nom de la fonction 'NTH_VALUE'? –

+0

@ RadimBača. . . Je vous remercie. –

+0

Merci @ RadimBača c'était très utile plein. J'apprécie vraiment ç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

Comment combiner avec GROUP BY OSI_KEY? – jarlh

+0

Désolé, raté le groupe par, vérifiez la mise à jour – Lamar

+0

Merci Lamar, Mais votre requête renvoie juste les cinq plus grands nombres dans cinq enregistrements, Mais ce dont j'ai besoin est cinq maximum l'un à côté de l'autre et d'autres fonctions d'agrégation (AVG, Variance, ...). – MohsenCs