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
Libérer: 2024-12-26 20:43:10
original
212 Les gens l'ont consulté

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     
Copier après la connexion

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;
Copier après la connexion

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);
Copier après la connexion
  • 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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal