Maison >base de données >tutoriel mysql >Comment puis-je identifier efficacement les lignes où la valeur d'une colonne change dans SQL ?
Sélection des lignes où la valeur d'une colonne a changé : techniques SQL
Déterminer les cas où une valeur de colonne subit une transition est une opération critique dans divers scénarios d’analyse de données. Cet article explore les techniques permettant d'identifier efficacement de tels changements dans un tableau.
Énoncé du problème
Considérez le tableau suivant avec les colonnes « Valeur » et « Temps » :
Value | Time | |
---|---|---|
0 | 15/06/2012 8:03:43 PM | |
1 | 15/06/2012 8:03:43 PM | * |
1 | 15/06/2012 8:03:48 PM | |
1 | 15/06/2012 8:03:53 PM | |
1 | 15/06/2012 8:03:58 PM | * |
2 | 15/06/2012 8:04:03 PM | * |
2 | 15/06/2012 8:04:08 PM | |
3 | 15/06/2012 8:04:13 PM | * |
3 | 15/06/2012 8:04:18 PM | |
3 | 15/06/2012 8:04:23 PM | |
2 | 15/06/2012 8:04:28 PM | * |
2 | 15/06/2012 8:04:33 PM |
La tâche consiste à identifier les lignes marquées d'un "*", indiquant les transitions dans la "Valeur". colonne.
Solution
Utilisation des fonctions de fenêtre (SQL Server 2012 et versions ultérieures)
Avec les fonctions de fenêtre introduites dans SQL Server 2012, cette opération peut être effectuée efficacement :
;WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
Cette requête calcule la ligne numéro dans chaque partition de « Valeur » et sélectionne la première ligne (rn = 1) pour chaque partition.
Utilisation des jointures de tables (SQL Server 2008 et versions antérieures)
Pour les versions de SQL Server antérieures à 2012, l'approche suivante peut être utilisée :
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'); ;WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x ) 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 auto-jointure sur la table, en comparant les lignes adjacentes pour identifier les changements de valeur. Cela nécessite une variable de table distincte pour stocker les résultats intermédiaires.
Remarque : Bien que les fonctions de fenêtre offrent de meilleures performances, elles peuvent ne pas être disponibles dans toutes les versions de SQL Server. Choisissez l'approche qui convient le mieux à votre version et à vos exigences de performances.
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!