Wenn ich das richtig verstehe, Sie haben Probleme, weil die Mächtigkeit der ON
Prädikat alle passenden Zeilen zurückgibt.
EV.Test_Result.test_row_id = t.test_row_id
and EV.Test_Result.start_time < t.start_time
Diese ON
werden alle der START_TIME Werte vergleichen, die die gleiche ID haben und zurück jede Kombination von Ergebnismengen, wo START_TIME kleiner als die t.start_time ist. Das ist eindeutig nicht das, was du willst.
and t.device_id = 1219
and t.waived = 0
Dies ist eigentlich ein Prädikat (ON
technisch eins ist), aber ich würde dies in einem aus mehreren Gründen subquery
/CTE
verwenden möchten: Sie begrenzen die Anzahl der Zeilen SQL
abgerufen hat und zu vergleichen.
etwas wie das folgende sein könnte, was man benötigt:
SELECT A.test_row_id
, A.test_result_id
, A.waived
, A.pass
, A.comment
FROM EV.Test_Result A
INNER JOIN (SELECT MAX(start_time) AS start_time
, test_row_id
FROM EV.Test_Result
WHERE device_id = 1219
AND waived = 0
GROUP BY test_row_id
) AS T ON A.test_row_id = T.test_row_id
AND A.start_time < T.start_time
ORDER BY A.test_row_id
Diese Abfrage gibt dann eine 1:M
Beziehung zwischen den Werten im ON
Prädikat, im Gegensatz zu den M:M
Abfrage, die Sie laufen hatte.
UPDATE: Da ich meine Abfrage sheepishly vermasselt versucht, auf SO
zu ändern, ich werde mich erlösen durch die physischen und logischen Befehle von Grund SQL
Abfrage Betreiber erklären:
Wie Sie wissen, Sie schreiben eine einfache SELECT
Anweisung wie folgt aus:
SELECT <aggregate column>, SUM(<non-aggregate column>) AS Cost
FROM <table_name>
WHERE <column> = 'some_value'
GROUP BY <aggregate column>
HAVING SUM(<non-aggregate column>) > some_value
ORDER BY <column>
Beachten Sie, dass, wenn Sie eine Aggregatfunktion verwenden, werden alle anderen Spalten in der GROUP BY oder eine andere Funktion erscheinen.
Nun erfordert SQL Server sie in dieser Reihenfolge geschrieben werden, obwohl es dies tatsächlich verarbeitet logisch durch die folgende Reihenfolge, die das Auswendiglernen wert ist:
- FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY
Es gibt weitere Details über SELECT - MSDN gefunden, aber das ist, warum alle Spalten in dem SELECT
Operator in der Gruppe oder in einer Aggregatfunktion sein (SUM
, MIN
, MAX
, etc) ... und auch, warum mein Lazy-Code ist fehlgeschlagen bei deinem ersten Versuch. :/ Beachten Sie auch, dass die ORDER BY
zuletzt ist (technisch TOP
Operator tritt danach auf), und das ohne es ist das Ergebnis nicht deterministisch, es sei denn eine Funktion wie DENSE_RANK
erzwingt es (dachte dies in der SELECT
Aussage auftritt).
Hoffe, dies hilft das Problem zu lösen und noch besser, wie SQL funktioniert. Prost
Wenn Sie eine Datumsspalte haben, die einen eindeutigen Zeitstempel (dh es ist mindestens datetime) zurückgibt, dann ist dies mit einer MAX-Funktion einfach. Wenn nicht ... nun, vielleicht ein Designfehler in Ihrer Tabellenstruktur. –
Wir haben eine start_time Spalte, die ein Datetime2 ist. Ich habe auch versucht, Max aber hatte Schwierigkeiten, das richtig geschrieben zu bekommen. Hast du ein Beispiel? Ich bin nicht sehr kompetent in SQL, das ist nicht meine Hauptberufsbeschreibung (obwohl ich versuche zu lernen!). – Johonn
Ein letzter Vorschlag wäre die Formatierung der Abfrage mit Einrückungen. SQL ignoriert Inline-Leerzeichen, die nicht in einer Zeichenfolge enthalten sind (Anmerkung (') ist das Zeichenfolgentrennzeichen in SQL) –