Ich habe eine Tabelle mit einer ID, einem Wert und einem Datum. In dieser Tabelle befinden sich viele IDs, Werte und Daten.
Datensätze werden regelmäßig in diese Tabelle eingefügt. Die ID bleibt immer gleich, aber gelegentlich ändert sich der Wert.
Wie kann ich eine Abfrage schreiben, die mir die ID und den Zeitpunkt der letzten Änderung des Werts angibt? Hinweis: Der Wert erhöht sich immer.
Aus diesen Beispieldaten:
Create Table Taco
( Taco_ID int,
Taco_value int,
Taco_date datetime)
Insert INTO Taco
Values (1, 1, '2012-07-01 00:00:01'),
(1, 1, '2012-07-01 00:00:02'),
(1, 1, '2012-07-01 00:00:03'),
(1, 1, '2012-07-01 00:00:04'),
(1, 2, '2012-07-01 00:00:05'),
(1, 2, '2012-07-01 00:00:06'),
(1, 2, '2012-07-01 00:00:07'),
(1, 2, '2012-07-01 00:00:08')
Das Ergebnis sollte sein:
Taco_ID Taco_date
1 2012-07-01 00:00:05
(Weil 00:05 das letzte Mal Taco_Value
geändert wurde.)
sql-server
sql-server-2008-r2
t-sql
SqlSandwiches
quelle
quelle
taco
hat nichts mit dem Essen zu tun?Antworten:
Diese beiden Abfragen beruhen auf der Annahme, dass
Taco_value
sie mit der Zeit immer größer werden.Eine Alternative mit weniger Fensterfunktionswahnsinn:
Beispiele bei SQLfiddle
Aktualisieren
Für diejenigen, die den Überblick behielten, gab es Streit darüber, was passieren würde, wenn sich
Taco_value
dies jemals wiederholen könnte. Wenn es von 1 auf 2 und dann wieder auf 1 gehen könnte,Taco_ID
funktionieren die Abfragen nicht. Hier ist eine Lösung für diesen Fall, auch wenn es nicht ganz die Technik von Gaps & Islands ist, die sich jemand wie Itzik Ben-Gan ausdenken kann, und selbst wenn sie für das OP-Szenario nicht relevant ist - es kann sein relevant für einen zukünftigen Leser. Es ist etwas komplexer, und ich habe auch eine zusätzliche Variable hinzugefügt - eineTaco_ID
, die immer nur eine hatTaco_value
.Wenn Sie die erste Zeile für eine ID einfügen möchten, bei der sich der Wert im gesamten Satz überhaupt nicht geändert hat:
Wenn Sie diese Zeilen ausschließen möchten, ist dies etwas komplexer, es werden jedoch noch kleinere Änderungen vorgenommen:
Aktualisierte SQLfiddle-Beispiele
quelle
value
wieder einGrundsätzlich ist dies @ Taryns Vorschlag, der sich auf ein einzelnes SELECT ohne abgeleitete Tabellen "konzentriert":
Hinweis: Diese Lösung berücksichtigt die Vorgabe,
Taco_value
die sich nur erhöhen kann. (Genauer gesagt, es geht davon aus, dassTaco_value
nicht auf einen vorherigen Wert zurückgekehrt werden kann - genau wie bei der verknüpften Antwort.)Eine SQL Fiddle-Demo für die Abfrage: http://sqlfiddle.com/#!3/91368/2
quelle
Sie sollten in der Lage sein, beide Funktionen zu verwenden
min()
undmax()
das Ergebnis zu erhalten:Siehe SQL Fiddle with Demo
quelle
Eine weitere Antwort, die auf der Annahme basiert, dass die Werte nicht wieder angezeigt werden (dies ist im Grunde @ Aarons Abfrage 2, zusammengefasst in einem Nest weniger):
Test bei: SQL-Fiddle
Und eine Antwort auf das allgemeinere Problem, bei dem Werte wieder auftreten können:
(oder mit
CROSS APPLY
so wird die ganze verwandte Zeile, einschließlich dervalue
, angezeigt):Test bei: SQL-Fiddle-2
quelle
dbo.Taco UNION ALL SELECT DISTINCT Taco_ID, NULL AS Taco_value, '19000101' AS Taco_date
) behoben werden .FYI +1 für die Bereitstellung von Musterstruktur und Daten. Das einzige, wonach ich hätte fragen können, ist die erwartete Ausgabe für diese Daten.
EDIT: Dieser würde mich verrückt machen. Ich war gerade neu, es gab einen "einfachen" Weg, dies zu tun. Ich habe die falschen Lösungen losgeworden und eine eingesetzt, die ich für richtig halte. Hier ist eine Lösung ähnlich wie @bluefeets, die jedoch die von @AaronBertrand durchgeführten Tests abdeckt.
quelle
value
Änderungen.Warum nicht einfach die Differenz zwischen dem Lag-Wert und dem Lead-Wert ermitteln? Wenn die Differenz Null ist, hat sie sich nicht geändert, ist sie nicht Null, hat sich geändert. Dies kann in einer einfachen Abfrage erfolgen:
quelle
lag...
Analysefunktion wurde erst "vor kurzem" in SQL Server 2012 eingeführt. Die ursprüngliche Frage betrifft eine Lösung für SQL Server 2008 R2. Ihre Lösung würde für SQL Server 2008 R2 nicht funktionieren.Könnte das so einfach sein wie das Folgende?
Angesichts dessen, dass taco_value immer zunimmt?
ps Ich bin selbst ein Anfänger in SQL, lerne aber langsam aber sicher.
quelle
Cannot perform an aggregate function on an expression containing an aggregate or a subquery