Problème :
Supposons que vous ayez une table avec deux colonnes : Valeur et Temps. Vous souhaitez identifier les lignes dans lesquelles la colonne Valeur a changé. En d'autres termes, vous devez trouver les moments où la valeur stockée a changé, indiqués par des lignes étoilées.
Solution :
Une approche pour résoudre ce problème consiste à exploiter la fenêtre fonctions et numéros de ligne dans une instruction SQL :
Introduire la ligne Nombres :
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table )
Cette étape introduit une nouvelle colonne appelée rn (numéro de ligne) qui attribue un numéro de séquence unique à chaque ligne de chaque partition de valeurs, par ordre croissant de temps.
Identifier les modifications :
SELECT * FROM x WHERE rn = 1;
Cette requête filtre les résultats doivent inclure uniquement les lignes avec rn égal à 1. Ce sont les premières lignes de chaque partition de valeur, représentant le début des changements de valeur.
Considération supplémentaire pour les hausses et les baisses Valeurs :
Si la colonne Valeur peut à la fois augmenter et diminuer, une approche plus complexe est requis :
Créer une table temporaire :
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'), (1,'20120615 8:03:43 PM'), (1,'20120615 8:03:48 PM'), (1,'20120615 8:03:53 PM'), (1,'20120615 8:03:58 PM'), (2,'20120615 8:04:03 PM'), (2,'20120615 8:04:08 PM'), (3,'20120615 8:04:13 PM'), (3,'20120615 8:04:18 PM'), (3,'20120615 8:04:23 PM'), (2,'20120615 8:04:28 PM'), (2,'20120615 8:04:33 PM');
Créez une table temporaire avec les exemples de données pour illustrer le processus.
Introduire les numéros de ligne (Encore une fois) :
WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x )
Identifier les changements de valeur :
SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
Cette requête effectue une jointure externe gauche entre le tableau avec les numéros de ligne et une version décalée de lui-même (y) pour vérifier les changements dans la colonne Valeur entre les lignes adjacentes. Les lignes avec des valeurs non NULL pour y.value représentent les changements.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!