2016-03-29 7 views
1

Ich habe eine Tabelle, die der folgenden ähnelt. Dies ist eine Daten aus einer dringenden Pflege-Center, mit der ROOMED_DT zu sein, wenn ein Patient einen Raum gegeben wird, und die CHECKOUT_DT ist die Zeit der Patient verlassen wird gelöscht:Berechnung der durchschnittlichen Zeitdifferenz über Zeilen und zwei Gruppen

PAT_ID  ROOMED_DT    CHECKOUT_DT   ROOM_NUM 
1   11/12/2015 03:22PM  11/12/2015 06:30PM Room 4 
2   11/12/2015 07:40PM  11/12/2015 10:30PM Room 4 
3   11/12/2015 10:55PM  11/12/2015 11:30PM Room 4 
4   11/12/2015 09:45AM  11/12/2015 12:00PM Room 5 
5   11/12/2015 12:02PM  11/12/2015 01:30PM Room 5 
6   11/12/2015 02:25PM  11/12/2015 04:30PM Room 5 
7   11/13/2015 07:22AM  11/13/2015 08:04AM Room 2 
8   11/13/2015 09:40AM  11/13/2015 10:30AM Room 2 
9   11/13/2015 10:55AM  11/13/2015 11:55AM Room 2 
10   11/13/2015 12:45PM  11/13/2015 02:00PM Room 1 
11   11/13/2015 04:02PM  11/13/2015 05:30PM Room 1 
12   11/13/2015 05:25PM  11/13/2015 08:30PM Room 1 

würde ich die Berechnung der durchschnittlichen Zeit gefallen Von dem Zeitpunkt an, zu dem der vorherige Patient verlassen wurde (CHECKOUT_DT), bis zum Erscheinen des nächsten Patienten (ROOMED_DT) für jeden Raum an jedem Tag, würde das Ergebnis in etwa so aussehen (ich mache die durchschnittlichen Zahlen, um des willens willen) der visuellen), mit der Zeit bis zum nächsten Patienten in Minuten.

SERVICE_DT  TIME_TO_NEXT_PAT 
11/12/2015  65.7 
11/13/2015  72.4 

Aber ich bin nicht sicher, wie die Differenz zwischen CHECKOUT_DT und ROOMED_DT über mehrere Patienten und mehrere Räume zu berücksichtigen. Hat jemand irgendwelche Ideen? Ich benutze Netezza.

Antwort

0

Sie können die analytische Funktion lead verwenden, um diese Ergebnisse zu erhalten.

hier ist die Abfrage

SELECT SERVICE_DATE 
, AVG(MINUTES_BETWEEN) 
FROM (
     SELECT PAT_ID 
     , ROOMED_DT::DATE SERVICE_DATE 
     , ROOMED_DT 
     , CHECKOUT_DT 
     , ROOM_NUM 
     , LEAD(ROOMED_DT,1) OVER (PARTITION BY ROOM_NUM ORDER BY ROOMED_DT) NEXT_CHECKED_IN 
     , MINUTES_BETWEEN(NEXT_CHECKED_IN,CHECKOUT_DT) 
     FROM SAMPLE 
     ORDER BY 1 
) FOO 
WHERE MINUTES_BETWEEN IS NOT NULL 
GROUP BY 1; 

SERVICE_DATE | AVG 
--------------+----------- 
2015-11-12 | 38.000000 
2015-11-13 | 62.000000 
(2 rows)