Heim >Datenbank >MySQL-Tutorial >Wie kann SQL Änderungen in Spaltenwerten im Laufe der Zeit identifizieren?

Wie kann SQL Änderungen in Spaltenwerten im Laufe der Zeit identifizieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-21 18:54:09894Durchsuche

How Can SQL Identify Changes in Column Values Over Time?

Änderungen in Spaltenwerten mithilfe von SQL identifizieren

Problem:

Angenommen, Sie haben eine Tabelle mit zwei Spalten: Wert und Zeit. Sie möchten Zeilen identifizieren, in denen sich die Spalte „Wert“ geändert hat. Mit anderen Worten, Sie müssen die Momente finden, in denen sich der gespeicherte Wert geändert hat, gekennzeichnet durch markierte Zeilen.

Lösung:

Ein Ansatz zur Lösung dieses Problems besteht in der Nutzung von Fenstern Funktionen und Zeilennummern innerhalb einer SQL-Anweisung:

  1. Zeile einführen Zahlen:

    WITH x AS (
        SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time)
        FROM dbo.table
    )

    Dieser Schritt führt eine neue Spalte namens rn (Zeilennummer) ein, die jeder Zeile innerhalb jeder Wertpartition eine eindeutige Sequenznummer in aufsteigender Reihenfolge der Zeit zuweist.

  2. Änderungen identifizieren:

    SELECT * FROM x WHERE rn = 1;

    Diese Abfrage filtert die Ergebnisse nach Schließen Sie nur Zeilen mit rn gleich 1 ein. Dies sind die ersten Zeilen in jeder Wertpartition, die den Beginn von Wertänderungen darstellen.

Zusätzliche Überlegungen zu steigenden und fallenden Werten:

Wenn die Spalte „Wert“ sowohl steigen als auch fallen kann, ist der Ansatz komplexer erforderlich:

  1. Temporäre Tabelle erstellen:

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

    Erstellen Sie eine temporäre Tabelle mit den Beispieldaten, um den Prozess zu veranschaulichen.

  2. Zeilennummern einführen (Noch einmal):

    WITH x AS (
        SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time)
        FROM @x
    )
  3. Wertänderungen identifizieren:

    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;

    Diese Abfrage führt einen linken äußeren Join zwischen den aus Tabelle mit den Zeilennummern und einer verschobenen Version von sich selbst (y), um nach Änderungen in der Spalte „Wert“ zwischen benachbarten Zeilen zu suchen. Zeilen mit Nicht-NULL-Werten für y.value stellen Änderungen dar.

Das obige ist der detaillierte Inhalt vonWie kann SQL Änderungen in Spaltenwerten im Laufe der Zeit identifizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn