Maison >base de données >tutoriel mysql >Comment identifier les lignes SQL où les valeurs des colonnes ont changé ?

Comment identifier les lignes SQL où les valeurs des colonnes ont changé ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-26 20:43:10259parcourir

How to Identify SQL Rows Where Column Values Have Changed?

Interroger des lignes avec des valeurs de colonne modifiées à l'aide de SQL

Comment identifier les instances de changements de valeur de colonne dans une table ? Cette requête permet d'identifier les lignes où des valeurs de colonnes spécifiques ont subi des modifications.

Pour illustrer, considérons le tableau suivant :

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     

L'objectif est de sélectionner les lignes marquées d'astérisques, indiquant les changements de valeur. Ceci est crucial pour déterminer les intervalles de temps associés à ces modifications, qui peuvent être exploités pour d'autres requêtes de base de données.

Solution :

Implémentation d'une requête SQL avec des fonctions de fenêtre et numéros de ligne, nous dérivons le souhaité lignes :

;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;

Explication :

  1. La fonction ROW_NUMBER() attribue des numéros de ligne séquentiels dans chaque partition en fonction de la colonne Valeur, créant ainsi des groupes de valeurs identiques.
  2. La condition WHERE rn = 1 suivante sélectionne uniquement la première ligne de chaque groupe, représentant l'occurrence initiale de chaque groupe distinct. valeur.

Considérations supplémentaires :

  • Pour les valeurs croissantes uniquement, la solution devient plus simple :
SELECT * FROM table WHERE value <> LAG(value) OVER (ORDER BY time);
  • Si les valeurs fluctuent à la fois vers le haut et vers le bas, une approche légèrement plus lente est requis :
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;

En exploitant la puissance des fonctions de fenêtre SQL, cette requête récupère efficacement les lignes où les valeurs des colonnes ont changé, fournissant ainsi des informations précieuses sur les fluctuations des données.

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