studio - sql server 2014
buscar el registro no nulo más reciente (3)
La consulta en SQLFiddle falla debido a la subconsulta que devuelve más de 1 fila.
Agregando TOP 1
correcciones que. Por favor, comprueba si está bien.
THEN
(SELECT TOP 1 dcrp
FROM tbl
WHERE sig_id = a.sig_id
AND id < a.id
AND dcrp IS NOT NULL)
Estoy intentando buscar el registro más reciente y encontrar una coincidencia que no sea NULL
. El problema es que mi subconsulta devuelve más de un resultado.
Conjunto de datos
| ID | DD | SIG_ID | DCRP | ---------------------------------------- | 1 | 2010-06-01 | 1 | Expert | | 2 | 2010-09-01 | 1 | Expert | | 3 | 2010-12-01 | 1 | Expert | | 4 | 2010-12-01 | 1 | Expert II | | 5 | 2011-03-01 | 1 | Expert II | | 6 | 2011-06-01 | 1 | (null) | | 7 | 2010-06-01 | 2 | Senior | | 8 | 2010-09-01 | 2 | Senior | | 9 | 2010-09-01 | 2 | Senior | | 10 | 2010-12-01 | 2 | Senior II | | 11 | 2011-03-01 | 2 | (null) | | 12 | 2011-03-01 | 2 | Senior | | 13 | 2010-06-01 | 3 | (null) | | 14 | 2010-09-01 | 3 | (null) | | 15 | 2010-12-01 | 3 | (null) |
Consulta
SELECT a.sig_id, a.id,
CASE
WHEN b.dcrp IS NULL
THEN
(SELECT dcrp
FROM tbl
WHERE sig_id = a.sig_id
AND id < a.id
AND dcrp IS NOT NULL)
ELSE b.dcrp
END AS dcrp
FROM
(SELECT sig_id, MAX(id) id
FROM tbl
GROUP BY sig_id) a
LEFT JOIN
(SELECT id, dcrp
FROM tbl
WHERE dcrp IS NOT NULL) b ON b.id = a.id
Resultado deseado
dcrp
más reciente para cada sig_id
:
| ID | DD | SIG_ID | DCRP | ---------------------------------------- | 5 | 2011-03-01 | 1 | Expert II | | 12 | 2011-03-01 | 2 | Senior | | 15 | 2010-12-01 | 3 | (null) |
Puedes usar lo siguiente:
;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY SIG_ID
ORDER BY CASE WHEN DCRP IS NOT NULL THEN 0 ELSE 1 END,
DD DESC) RN
FROM tbl
)
SELECT *
FROM CTE
WHERE RN = 1
Y el violín .
;with si as (
select distinct sig_id from tbl
)
select *
from si
cross apply (select top 1 * from tbl where si.sig_id=tbl.sig_id order by case when dcrp is null then 1 else 0 end asc,dd desc) sii
y con el violinista: http://sqlfiddle.com/#!3/8e267/2/0