sql >> Base de Datos >  >> RDS >> Sqlserver

SQL:¿cómo consulto las readmisiones en TSQL?

Aquí hay un comienzo:

sqlfiddle

nuevo violín

Obtiene cada visita para cada UID en orden de admitDT, luego empareja cada visita con la siguiente visita en ese resultado. Si la fecha de admisión actual está entre la última fecha de alta y 30 días después, selecciónela. Sin embargo, hay algunos puntos extraños:se muestra que el UID 1 fue admitido el 12/06/2012 y nunca fue dado de alta, pero luego fue admitido nuevamente el 20/06/2013 y dado de alta el mismo día.

editar:reestructurado un poco para reducir el número de uniones

WITH cte AS (
  SELECT visitid,uid,dischargedt,admitdt,
    row_number()over(partition BY uid ORDER BY admitdt) AS r
  FROM t
  )
SELECT
c1.visitid AS v1, c2.visitid AS v2,
c1.uid,
c1.dischargedt as [Discharged from first visit],
c2.admitdt as [Admitted to next visit]
FROM cte c1
INNER JOIN cte c2 ON c1.uid=c2.uid
WHERE c1.visitid<>c2.visitid
AND c1.r+1=c2.r
AND c2.admitdt BETWEEN c1.dischargedt AND dateadd(d,30,c1.dischargedt )
ORDER BY c1.uid

Resultados :

| V1 | V2 | UID | DISCHARGED FROM FIRST VISIT |      ADMITTED TO NEXT VISIT |
|----|----|-----|-----------------------------|-----------------------------|
| 25 | 38 |   2 | June, 11 2013 16:13:00+0000 | June, 12 2013 10:10:00+0000 |
| 38 | 12 |   2 | June, 12 2013 10:10:00+0000 | June, 17 2013 06:51:00+0000 |
| 18 | 34 |   3 | June, 11 2013 12:08:00+0000 | June, 12 2013 08:40:00+0000 |
| 21 | 22 |   3 | June, 12 2013 14:40:00+0000 | June, 13 2013 10:00:00+0000 |
| 22 | 16 |   3 | June, 14 2013 12:00:00+0000 | June, 19 2013 04:48:00+0000 |