Maison >base de données >tutoriel mysql >Comment SQL peut-il identifier les modifications apportées aux valeurs des colonnes au fil du temps ?

Comment SQL peut-il identifier les modifications apportées aux valeurs des colonnes au fil du temps ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 18:54:09822parcourir

How Can SQL Identify Changes in Column Values Over Time?

Identification des modifications dans les valeurs des colonnes à l'aide de SQL

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 :

  1. 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.

  2. 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 :

  1. 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.

  2. Introduire les numéros de ligne (Encore une fois) :

    WITH x AS (
        SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time)
        FROM @x
    )
  3. 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!

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