2017-02-14 2 views
1

Erste Post hier, aber kann jemand helfen oder mir helfen, das folgende Problem zu verstehen.Für die folgende Tabelle "Patient_Table", wie kann ich herausfinden, die Gesamtzahl der Tage patient_id 22 war krank .Microsoft SQL Server berechnen Gesamtzeit zwischen aufeinander folgenden Ereignissen

ID Patient_ID  Listing_Number  Date    Status 
----------------------------------------------------------------- 
1  22    1     01/01/2016  Healthy 
2  22    2     01/11/2016  Sick 
3  34    1     01/13/2016  Healthy 
4  22    3     01/20/2016  Healthy 
5  22    4     01/22/2016  Sick 
6  22    5     01/23/2016  Healthy 

unten ist meine Logik so weit, aber ich bin mir nicht sicher über die richtige Syntax.

declare 
@count  int = 1, 
@Days_sicks int = 0 

while @count <= (select max (Listing_number) from Patient_Table where Patient_id = '22') 

begin 
    case 
    when (select status from Patient_Table where Patient_id = '22' and Listing_number = @count) = 'Sick' 
    then @Days_sicks = @Days_sicks + datediff('dd', (select min date from Patient_Table where patient_id = 22 and listing_number > @count and status != 'Sick'), (select date from patient_table where patient_id = 22 and listing_number = @count) 
    else @Days_sicks 
    end as Days_sicks 

set @Count = @Count + 1 
END; 

Ich habe auch diesen hat man versucht, aber es ist nicht sehr gut arbeiten, und ich habe Problem mit der Gruppe durch Klausel

SELECT t1.patient_id, 
    DATEDIFF(dd, 
     t1.date, 
     (SELECT MIN(t3.date) 
     FROM Patient_Table t3 
     WHERE t3.patient_id = t1.patient_id 
     AND t3.date> t1.date) as Days_sicks 
    ) 
FROM Patient_Table t1 
WHERE EXISTS(
    SELECT 'NEXT' 
    FROM Patient_Table t2 
    WHERE t2.patient_id = t1.patient_id 
    AND t2.date> t1.date 
    AND t2.status != 'sick') 
    and t1.patient_id = '22' 

Gewünschtes Ergebnis

Patient id Days_sicks 
22   10 
+0

Was ist die Logik der Frage, min (Datum) bis max (Datum), wo Status = 'Sick'? – McNets

+0

könnten Sie bitte sql-server Version – AldoRomo88

+0

@why 10 angeben? sollte es nicht 11 sein? – CodingYoshi

Antwort

2

Verwenden Sie die Funktion lead() und dann Aggregation:

select patient_id, 
     sum(datediff(day, date, coalesce(next_date, getdate()))) 
from (select pt.*, 
      lead(date) over (partition by patient_id order by date) as next_date 
     from patient_table pt 
    ) pt 
where status = 'Sick' 
group by patient_id; 

Hinweis: Wenn momentan jemand krank ist, wird das aktuelle Datum für das Ende des "kranken" Status verwendet.

Dies funktioniert auch, wenn der Patient bei mehreren Besuchen krank ist.

+0

Danke Gordon. Das hat perfekt funktioniert! –

0
Select s.Patient_ID, 
    sum(datediff(day, s.Date, coalesce(h.date, getdate()) totalDaysSick 
From table s left join table h 
    on h.Patient_ID = s.Patient_ID 
    and h.Status = 'Healthy' 
    and s.Status ='Sick' 
    and h.Date = (Select Min(date) from table 
        where Patient_ID = s.Patient_ID 
        and Date > s.Date) 
Group By Patient_Id 
0

können Sie verwenden Lag Windowing-Funktion und nach Datum geordnet, dann eine datediff tun, um die Anzahl der Tage zwischen aktuellen und früheren Zeitpunkt zu finden. Dann eine Summe auf die Anzahl der Tage:

Verwandte Themen