sql >> Database >  >> RDS >> Sqlserver

SQL - Hoe vraag ik om heropnames in TSQL?

Hier is een begin:

sqlfiddle

nieuwe viool

Het krijgt elk bezoek voor elke UID in volgorde van toelating, en koppelt vervolgens elk bezoek aan het volgende bezoek in dat resultaat. Als de huidige opnamedatum tussen de laatste ontslagdatum en 30 dagen daarna ligt, selecteert u deze. Er zijn echter enkele rare punten - UID 1 blijkt te zijn toegelaten op 12-6-2012 en nooit ontslagen, maar vervolgens opnieuw opgenomen op 20-6-2013 en dezelfde dag ontslagen.

edit:een beetje geherstructureerd om het aantal joins te verminderen

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

Resultaten :

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


  1. hoe recursieve CTE en normale CTE te combineren?

  2. MySql Invoegen indien niet aanwezig twee kolommenpaar anders bijwerken

  3. Eenvoudige 'draaitabel' van Postgres

  4. Geneste CAST werkt niet