tutorial studio sp2 para microsoft management instalar descargar actualizar sql sql-server sql-server-2008-r2

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) |

SQL Fiddle


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