Maison >base de données >tutoriel mysql >Comment puis-je identifier efficacement les lignes où la valeur d'une colonne change dans SQL ?

Comment puis-je identifier efficacement les lignes où la valeur d'une colonne change dans SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-25 02:56:101011parcourir

How Can I Efficiently Identify Rows Where a Column Value Changes in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn