Когда ОП ответил, я пошел с буквальным и угаданным ответом. Первый буквальный ответ;если предыдущий ряд равен NULL
, используйте тот, что предыдущий:
WITH VTE AS (
SELECT *
FROM (VALUES(1,47676,CONVERT(date,NULL),CONVERT(date,'20150112'),CONVERT(date,'20151231')),
(1,47676,CONVERT(date,'20151231'),CONVERT(date,'20150209'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20150224'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151005'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151021'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151026'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151120'),CONVERT(date,NULL))) V(tipoProtocolo,numeroProtocolo,dataReferencia,dataAssinatura,dataVencimento)),
CTE AS(
SELECT V.tipoProtocolo,
V.numeroProtocolo,
V.dataReferencia,
V.dataAssinatura,
V.dataVencimento,
LAG(dataVencimento) OVER (PARTITION BY numeroProtocolo, tipoProtocolo ORDER BY dataAssinatura) AS dataReferencia1,
LAG(dataVencimento,2) OVER (PARTITION BY numeroProtocolo, tipoProtocolo ORDER BY dataAssinatura) AS dataReferencia2
FROM VTE V)
SELECT C.tipoProtocolo,
C.numeroProtocolo,
C.dataReferencia,
C.dataAssinatura,
C.dataVencimento,
ISNULL(C.dataReferencia1,C.dataReferencia2) AS dataReferencia
FROM CTE C;
Другой - это то, что, как я подозреваю, означает OP действительно , и что они хотят, чтобы последний не- NULL
значение. Если это так, то это «классическая» проблема пробелов и островков:
WITH VTE AS (
SELECT *
FROM (VALUES(1,47676,CONVERT(date,NULL),CONVERT(date,'20150112'),CONVERT(date,'20151231')),
(1,47676,CONVERT(date,'20151231'),CONVERT(date,'20150209'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20150224'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151005'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151021'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151026'),CONVERT(date,NULL)),
(1,47676,CONVERT(date,NULL),CONVERT(date,'20151120'),CONVERT(date,NULL))) V(tipoProtocolo,numeroProtocolo,dataReferencia,dataAssinatura,dataVencimento)),
Grps AS(
SELECT V.tipoProtocolo,
V.numeroProtocolo,
V.dataReferencia,
V.dataAssinatura,
V.dataVencimento,
COUNT(dataVencimento) OVER (PARTITION BY numeroProtocolo, tipoProtocolo ORDER BY dataAssinatura
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS Grp
FROM VTE V)
SELECT G.tipoProtocolo,
G.numeroProtocolo,
G.dataReferencia,
G.dataAssinatura,
G.dataVencimento,
MAX(dataVencimento) OVER (PARTITION BY G.Grp) AS dataReferencia,
G.Grp
FROM Grps G
ORDER BY dataAssinatura;
Замечу, что странно, что вы называете столбец выражением LAG
dataReferencia
, несмотря на это. выражение находится на dataVencimento
(и уже есть столбец с именем dataReferencia
).