Wie Sie wissen, die LAG() & LEAD() analytische Funktionen zugreifen Daten aus einer vorherigen und nächsten Zeile in der gleichen Ergebnismenge ohne die Verwendung eines Self-Join. Aber ist es möglich, NULL-Werte zu ignorieren, bis auf einen NOT NULL-Wert zugegriffen wird?Ist es möglich, NULL-Werte zu ignorieren, wenn Sie LAG() - und LEAD() - Funktionen in SQL Server verwenden?
Antwort
Oracle 11 unterstützt die Option ignore nulls
, die genau das tut, was Sie wollen. Natürlich geht es bei Ihrer Frage um SQL Server, aber manchmal ist es ermutigend zu wissen, dass die Funktionalität irgendwo existiert.
Es ist möglich, diese Funktionalität zu simulieren. Die Idee besteht darin, basierend auf dem vorhergehenden Wert Nullwerte einer Gruppe zuzuweisen. Im Wesentlichen zählt dies die Anzahl der Nicht-Null-Werte davor. Sie können dies mit einer korrelierten Unterabfrage tun. Oder interessanterweise mit dem Unterschied zweier Zeilennummern. Dann können Sie innerhalb der Gruppe einfach max()
verwenden.
Ich denke, das Folgende macht was Sie wollen. Es sei angenommen, dass col
NULL
Werte enthält und ordering
hat die Reihenfolge für die Zeilen:
select t.*,
max(col) over (partition by grp) as LagOnNull
from (select t.*,
(row_number() over (order by ordering) -
row_number() over (partition by col order by ordering)
) as grp
from table t
) t;
Die lead()
ist ähnlich, aber die Reihenfolge umgekehrt ist. Und dies funktioniert mit zusätzlichen Partitionierungsschlüsseln, aber Sie müssen sie zu allen Fensterausdrücken hinzufügen.
Es ist möglich, Fensterfunktionen zu verwenden. Lesen Sie diese article von Itzik Ben-Gan für weitere Details.
Im folgenden Code erhält die CTE den neuesten NOT NULL ID-Wert, dann erhält die nächste Auswahl den tatsächlichen Spaltenwert. In diesem Beispiel wird LAG verwendet. z.
-- DDL for T1
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'dbo.T1', N'U') IS NOT NULL DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
id INT NOT NULL CONSTRAINT PK_T1 PRIMARY KEY,
col1 INT NULL
);
-- Small set of sample data
TRUNCATE TABLE dbo.T1;
INSERT INTO dbo.T1(id, col1) VALUES
(2, NULL),
(3, 10),
(5, -1),
(7, NULL),
(11, NULL),
(13, -12),
(17, NULL),
(19, NULL),
(23, 1759);
;WITH C AS
(
SELECT
id,
col1,
MAX(CASE WHEN col1 IS NOT NULL THEN id END) OVER(ORDER BY id ROWS UNBOUNDED PRECEDING) AS grp
FROM dbo.T1
)
SELECT
id,
col1,
(SELECT col1 FROM dbo.T1 WHERE id = grp) lastval
FROM C;
- 1. SQL Lead und Lag Funktionen von C# Code
- 2. Ist es möglich, analytische Funktionen in Hibernate zu verwenden?
- 3. LAG-Funktionen und NULLEN
- 4. Lag() mit conditon in SQL Server
- 5. Schnellste Implementierung von Lead() oder Lag() Fensterfunktionen in MonetDB
- 6. Ist es möglich, anonyme Funktionen in C++ .NET zu verwenden?
- 7. Ist es möglich, bestimmte Komponententests zu ignorieren?
- 8. Ist es möglich, Assertions in doxygen generierten Referenzgraphen zu ignorieren?
- 9. Ist es möglich, alle Funktionen zu verschachteln?
- 10. SQL Server 2005-Import-Assistent und Nullwerte
- 11. Kombinieren von CONCAT- und LAG-Funktionen
- 12. BeanUtils.copyProperties ignorieren Nullwerte
- 13. Alternative zu Lag SQL-Befehl
- 14. Ist es möglich, Mockito in Kotlin zu verwenden?
- 15. Ist es möglich, 2 Mitgliedschaftsanbieter in ASP.NET zu verwenden?
- 16. Ist es möglich, einen Ausgabeparameter einer gespeicherten Prozedur zu ignorieren?
- 17. Verwenden Sie den Firmennamen (Account) und nicht Kontakt als Lead
- 18. Ist es möglich, eine Transaktion ignorieren
- 19. ist es möglich, TypeScript und Babel zusammen zu verwenden
- 20. Wenn Sie jQuery .each() verwenden, ist es möglich, eine nicht anonyme Funktion zu verwenden?
- 21. ist es möglich, negative Abfrage Boost in Lucene zu verwenden?
- 22. Ist es möglich, tab-ähnliche Funktionen zu tmux-Fenstern hinzuzufügen?
- 23. Ist es möglich, sql% rowcount für SELECT zu verwenden?
- 24. Wie man BeanUtils bittet, Nullwerte zu ignorieren
- 25. Ist es möglich, globale Variablen in Rust zu verwenden?
- 26. Ist es möglich, SQL Server Compact Edition in einem Open Source-Projekt zu verwenden?
- 27. Ist es möglich, SQL Server in Python ohne externe Bibliotheken zu verwenden?
- 28. SQL Server: Ist es möglich, in zwei Tabellen gleichzeitig einzufügen?
- 29. Ist es möglich, eine Abhängigkeit zwischen PostgreSQL-Funktionen zu finden?
- 30. Ist es möglich, in .hgignore gerootete Muster zu verwenden?
Danke für Ihre Antwort Gordon. Aber ich kann nicht verstehen, was Col2 in diesem Beispiel ist? – Mostapha777
'col2' sollte' col' sein, das Argument zu 'lag()'/'lead()'. –
Kreative Lösung Gordon. Aber leider hat es bei mir nicht funktioniert :( – Mostapha777