declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
la sélection ci-dessus me renvoie ce qui suit.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
Comment puis-je obtenir les éléments suivants:
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Réponses:
Exemple de SQL Fiddle
Production
Edit: c'est une solution généralisée qui fonctionnera sur la plupart des plates-formes de base de données. Lorsqu'une meilleure solution est disponible pour votre plate-forme spécifique (par exemple, gareth), utilisez-la!
la source
La dernière version de SQL Server (2012) permet ce qui suit.
ou
C'est encore plus rapide. La version partitionnée se termine en 34 secondes sur 5 millions de lignes pour moi.
Merci à Peso, qui a commenté le fil de discussion SQL Team mentionné dans une autre réponse.
la source
ROWS UNBOUNDED PRECEDING
place deROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. Ce n'était pas immédiatement évident pour moi si cela fonctionnerait, mais cela a fonctionné :-)À partir de SQL Server 2012, cela pourrait être facile:
parce que la
ORDER BY
clauseSUM
par défaut signifieRANGE UNBOUNDED PRECEDING AND CURRENT ROW
pour le cadre de fenêtre ("Remarques générales" sur https://msdn.microsoft.com/en-us/library/ms189461.aspx )la source
Une version CTE, juste pour le plaisir:
Retour:
la source
Commençons par créer une table avec des données factices ->
ici je rejoins la même table (SELF Joining)
RÉSULTAT :
nous allons maintenant additionner simplement la valeur de t2 et nous obtiendrons les ans
Résultat désiré
Effacer le mannequin
la source
rank()
et un autre ordre par clause pour le résoudre.Réponse tardive mais montrant une autre possibilité ...
La génération de somme cumulative peut être plus optimisée avec la
CROSS APPLY
logique.Fonctionne mieux que le
INNER JOIN
& uneOVER Clause
fois analysé le plan de requête réel ...la source
set io statistics on
et comparez le processeur et les temps réels.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
la source
correlated subquery
pour chaque ligne du jeu de résultats, analysant de plus en plus de lignes au fur et à mesure. Il ne garde pas un total courant et scanne les données une fois comme le peuvent les fonctions de fenêtre.Il existe une implémentation CTE beaucoup plus rapide disponible dans cet excellent article: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
Le problème dans ce fil peut être exprimé comme ceci:
la source
Vous pouvez utiliser cette requête simple pour le calcul progressif:
la source
Une fois la table créée -
la source
Ci-dessus (Pre-SQL12), nous voyons des exemples comme celui-ci: -
Plus efficace...
la source
Essaye ça
la source
Essaye ça:
la source
La solution SQL qui combine «RANGS ENTRE RANGÉE PRÉCÉDENTE ET ACTUELLE NON LIMITÉE» et «SOMME» a fait exactement ce que je voulais réaliser. Merci beaucoup!
Si cela peut aider quelqu'un, voici mon cas. Je voulais cumuler +1 dans une colonne chaque fois qu'un créateur est trouvé comme "Some Maker" (exemple). Sinon, pas d'incrément mais afficher le résultat de l'incrément précédent.
Donc ce morceau de SQL:
M'a permis d'obtenir quelque chose comme ça:
Explication de ci-dessus: Cela commence le décompte de "certains fabricants" avec 0, Some Maker est trouvé et nous faisons +1. Pour l'utilisateur 1, MakerC est trouvé, nous ne faisons donc pas +1 mais le décompte vertical de Some Maker est bloqué à 2 jusqu'à la ligne suivante. Le partitionnement est par l'utilisateur, donc lorsque nous changeons d'utilisateur, le nombre cumulé est de retour à zéro.
Je suis au travail, je ne veux aucun mérite sur cette réponse, dis simplement merci et montre mon exemple au cas où quelqu'un serait dans la même situation. J'essayais de combiner SOMME et PARTITION mais la syntaxe étonnante «RANGÉES ENTRE LA RANGÉE PRÉCÉDENTE ET ACTUELLE NON LIMITÉE» a complété la tâche.
Merci! Groaker
la source
Sans utiliser aucun type de salaire cumulatif JOIN pour une personne, récupérez à l'aide de la requête suivante:
la source
Pour Ex: SI vous avez une table avec deux colonnes, une est ID et la seconde est un nombre et souhaite connaître la somme cumulée.
la source