Ich verwende SQL Server 2016 und die Daten, die ich verwende, haben das folgende Formular.
CREATE TABLE #tab (cat CHAR(1), t CHAR(2), val1 INT, val2 CHAR(1));
INSERT INTO #tab VALUES
('A','Q1',2,NULL),('A','Q2',NULL,'P'),('A','Q3',1,NULL),('A','Q3',NULL,NULL),
('B','Q1',5,NULL),('B','Q2',NULL,'P'),('B','Q3',NULL,'C'),('B','Q3',10,NULL);
SELECT *
FROM #tab;
Ich möchte die letzten Nicht-Null-Werte über Spalten erhalten val1
und nach val2
gruppiert cat
und sortiert nach t
. Das Ergebnis, das ich suche, ist
cat val1 val2 A 1 P B 10 C
Das nächste, was ich verwendet habe, ist das LAST_VALUE
Ignorieren des, ORDER BY
was nicht funktionieren wird, da ich den bestellten letzten Nicht-Null-Wert benötige.
SELECT DISTINCT
cat,
LAST_VALUE(val1) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val1,
LAST_VALUE(val2) OVER(PARTITION BY cat ORDER BY (SELECT NULL) ) AS val2
FROM #tab
cat val1 val2 A NULL NULL B 10 NULL
Die tatsächliche Tabelle enthält mehr Spalten für cat
(Datums- und Zeichenfolgenspalten) und mehr Wertespalten (Datums-, Zeichenfolgen- und Zahlenspalten), um den letzten Wert ungleich Null auszuwählen.
Irgendwelche Ideen, wie man diese Auswahl trifft.
sql-server
window-functions
Edmund
quelle
quelle
cat
bestellt vont
.t
Werte wiederholen sich. Es handelt sich nicht um gut erzogene Daten.PARTITION BY cat ORDER BY t, id
zum Beispiel. Andernfalls kann dieselbe Abfrage (jede Abfrage) bei separaten Ausführungen zu unterschiedlichen Ergebnissen führen. Wenn die Spalten in der Tabelle nur die sind, die Sie anzeigen, sehe ich jedoch nicht, wie wir eine bestimmte Reihenfolge haben können!Antworten:
Die Verwendung der Verkettungstechnik aus The Last non NULL Puzzle von Itzik Ben Gan würde mit Ihren Datentabellen für Beispieltabellen und Spalten so aussehen.
Eine andere Möglichkeit, diese Abfrage zu schreiben, die die Schritte in CTEs unterteilt, um möglicherweise besser zu zeigen, was vor sich geht. Es gibt genau den gleichen Ausführungsplan wie die obige Abfrage.
Diese Lösung nutzt die Tatsache, dass das Verketten eines Nullwerts mit etwas zu einem Nullwert führt. SET CONCAT_NULL_YIELDS_NULL (Transact-SQL)
quelle
Fügen Sie einfach eine Prüfung auf NULL in der Partition hinzu
quelle
Das sollte es tun. row_number () und ein Join
Wenn Sie keine gute Sorte haben, müssen Sie hoffen, dass nur einer der Q3 nicht null ist.
quelle