1
votes

Requête en SQL pour additionner le nième plus grand d'une colonne

J'ai deux colonnes qui me tiennent à cœur: YearMonth et Value .

Comment puis-je additionner les 50ème (1ère à 50ème, c'est-à-dire 1ère, 2ème, ..., 50ème) plus grandes valeurs de Valeur et créer une nouvelle colonne en fonction des critères?

Je suis capable de faire SUM (CASE WHEN Value> 100 THEN Value END) AS LargeValue mais la 1ère au 50ème plus grande valeur change tous les YearMonth , donc cela ne Ce n'est pas tout à fait raison.

Je n'ai trouvé aucune solution à ce problème, et la plupart des réponses trouvent plutôt que la somme la plus grande.

Le tableau ressemble à ceci ( simplifié):

====================
YearMonth Value Flow
====================
201801   500   10
201801   400   -5
 ...     ...   ...
201802   700   20
201802   100  -20 
201802   50    10


3 commentaires

Faites une somme sur un plus petit Sélectionnez où vous commandez par valeur et faites un rownum <50 ou quelque chose comme ça


pourriez-vous nous donner un exemple de sortie pour votre entrée donnée et le SGBDR SQL que vous travaillez comme Oracle SQL Server, etc.


Je n'ai pas encore d'exemple de sortie, car je ne sais pas comment commencer à créer la requête. Cependant, j'utilise SQL Server


3 Réponses :


0
votes

Vous pouvez utiliser une table dérivée classant la ligne par valeur décroissante et limitant le résultat à 50 lignes. Puis prenez la somme de cela.

La manière dont la limitation est écrite dépend du SGBD. Dans beaucoup d’entre eux, LIMIT fonctionnera.

SELECT sum(x.value)
       FROM (SELECT t.value
                    FROM elbat t
                    ORDER BY t.value DESC
                    LIMIT 50) x;


0 commentaires

2
votes

Vous pouvez utiliser les fonctions de fenêtre:

select t.yearmonth, sum(value) as top50_sum
from (select t.*,
             row_number() over (partition by yearmonth order by value desc) as seqnum
      from t
     ) t
where seqnum <= 50
group by yearmonth

Si vous voulez juste une ligne par yearmonth dans le jeu de résultats, utilisez group by code >:

select t.*,
       sum(case when seqnum <= 50 then value end) over
           (partition by yearmonth) as top50_sum
from (select t.*,
             row_number() over (partition by yearmonth order by value desc) as seqnum
      from t
     ) t;


0 commentaires

0
votes
SELECT t.*, 
       SUM(CASE WHEN t.r < 51 THEN t.value ELSE 0 END) OVER() runningtotal 
  FROM (
         SELECT a.yearmonth, 
                a.value, 
                RANK() OVER (ORDER BY value DESC) r 
           FROM yourtable a ) t 
 ORDER BY t.r asc
Firts creating a ranked table order than creating a runningtotal column for the ranked table only for the first 50 elements.

2 commentaires

Merci. J'ai essayé ceci, mais j'ai eu Failed. 4104: L'identifiant en plusieurs parties "a.Value" n'a pas pu être lié . Aucune suggestion?


@ Mataunited18, corrigé que cela aurait dû être une valeur dans la sélection externe.