Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL - Wie frage ich nach Wiederzulassungen in TSQL ab?

Hier ist ein Anfang:

sqlfiddle

neue Geige

Es erhält jeden Besuch für jede UID in der Reihenfolge von allowDT und paart dann jeden Besuch mit dem nächsten Besuch in diesem Ergebnis. Wenn das aktuelle Aufnahmedatum zwischen dem letzten Entlassungsdatum und 30 Tagen danach liegt, wählen Sie es aus. Es gibt jedoch einige seltsame Punkte - UID 1 wurde am 12.06.2012 aufgenommen und nie entlassen, aber am 20.06.2013 erneut aufgenommen und am selben Tag entlassen.

edit:etwas umstrukturiert, um die Anzahl der Joins zu reduzieren

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

Ergebnisse :

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