Come sapete, le funzioni analitiche di LAD() & LEAD() accedono ai dati da una riga precedente e successiva nello stesso set di risultati senza l'uso di un self-join. Ma è possibile ignorare i valori NULL fino all'accesso a un valore NOT NULL?È possibile ignorare i valori NULL quando si utilizzano le funzioni LAG() e LEAD() in SQL Server?
risposta
Oracle 11 supporta l'opzione ignore nulls
che fa esattamente ciò che si desidera. Naturalmente, la tua domanda riguarda SQL Server, ma a volte è incoraggiante sapere che la funzionalità esiste da qualche parte.
È possibile simulare questa funzionalità. L'idea è di assegnare valori nulli a un gruppo, in base al valore precedente. In sostanza, questo è il conteggio del numero di valori non nulli prima di esso. Puoi farlo con una sottoquery correlata. O, più interessante, con la differenza di due numeri di riga. Quindi all'interno del gruppo, puoi semplicemente usare max()
.
Penso che quanto segue fa quello che vuoi. Si supponga che col
contiene NULL
valori e ordering
ha l'ordinamento per le righe:
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;
Il lead()
è simile, ma l'ordine è invertito. E ciò funzionerà con chiavi di partizionamento aggiuntive, ma è necessario aggiungerle a tutte le espressioni della finestra.
È possibile utilizzare le funzioni della finestra. Leggi questo article di Itzik Ben-Gan per maggiori dettagli.
Nel codice seguente, il cte sta ottenendo il valore di identificazione NOT NULL più recente, quindi la selezione successiva ottiene il valore di colonna effettivo. Questo esempio utilizza LAG. es.
-- 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. Funzioni LAG e NULLS
- 2. Lag/lead per gruppo in R e dplyr
- 3. dplyr: lead() e lag() errati se usati con group_by()
- 4. Vincolo NULL SQL Server
- 5. con valori di tabella funzioni utilizzando IF in SQL Server
- 6. SQL e Null I valori in cui la clausola
- 7. Dichiarazione caso SQL Server quando IS NULL
- 8. Come mantenere i valori NULL quando si utilizza SSIS per importare da file flat in SQL Server 2005
- 9. Quando utilizzare le transazioni in SQL Server
- 10. compositore update mantiene overwriting parameters.yml quando si utilizzano valori personalizzati
- 11. Ignora valori Null quando si aggiorna il database in Hibernate
- 12. Immettere valori null con l'ultimo importo non null - Oracle SQL
- 13. Express: è possibile ignorare le sessioni per i file statici?
- 14. In SQL Server, quando è necessario utilizzare GO e quando si utilizza il punto e virgola;?
- 15. È possibile ignorare tutti i segnali?
- 16. SQL Decode Null Valori
- 17. SQL Server 2005: Ordine con valori NULL alla fine
- 18. lag terribile in Chrome quando si utilizza effetto di parallasse
- 19. Upserts in mongodb quando si utilizzano valori _id personalizzati
- 20. È possibile prevenire attacchi man-in-the-middle quando si utilizzano certificati autofirmati?
- 21. Come si aggiunge una colonna a una tabella in SQL Server che non consente valori null?
- 22. Perché le funzioni con valori scalari di SQL Server diventano più lente?
- 23. Ignorare i campi null in Json.net
- 24. È possibile forzare la richiesta simultanea quando si utilizzano le sessioni ASP.NET?
- 25. Errore I2C quando si utilizzano le funzioni di configurazione del monitor di Windows
- 26. È possibile utilizzare SQL Server e Mongo insieme?
- 27. È possibile aggiungere intestazioni di richiesta personalizzate quando si utilizzano le schede personalizzate di Chrome?
- 28. Perché è possibile assegnare valori alle funzioni integrate in Python?
- 29. Oracle lag tra commit e select
- 30. SQL Server vincolo UNIQUE con i NULL duplicati
Grazie per la risposta, Gordon. Ma non riesco a capire cosa c'è "col2" in questo esempio? – Mostapha777
'col2' avrebbe dovuto essere' col', l'argomento di 'lag()'/'lead()'. –
Soluzione creativa Gordon. Ma sfortunatamente non ha funzionato per me :( – Mostapha777