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 Réponses :
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;
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;
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.
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.
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