2016-09-12 1 views
0

Ich versuche, eine Tabelle auszufüllen, die eine PersonID mit einem Termindatum enthält, und ob nach dem Besuch ein Folgeanruf getätigt wurde.Row_Number Datumsbereich

Tbl_Appt

PersonID  Appt_Date 
    1   1/1/2016 
    1   1/3/2016 
    1   1/9/2016 
    1   1/31/2016 

Tbl_Call

PersonID  Call_Date 
    1   1/5/2016 
    1   2/1/2016 

gewünschte Tabelle: Tbl_FollowUp

PersonID  Appt_Date Follow_Up_Flag 
    1   1/1/2016 N 
    1   1/3/2016 Y 
    1   1/9/2016 N 
    1   1/31/2016 Y 

Die Tbl_FollowUp.Follow_Up_Flag = Y ist, wenn der Tbl_Call.Call_Date ist> Tbl_Appt.Appt_Date und vor das nächste Appt.

Ich nehme an, ich würde Row_Number/Partition verwenden, aber diese Funktionen spielen mich an (siehe meine früheren Posts).

Vielen Dank im Voraus!

+0

Ihre gewünschte Ausgabe falsch scheint. Warum gibt es ein Y neben 1/3/2016? – Kostya

+3

Da dies nicht Ihre erste SQL-Frage ist, sollten Sie jetzt immer angeben, welche Datenbank Sie verwenden. SQL Server? Und wenn ja, welche Version? Es kann bestimmen, welche Fensterfunktionen verfügbar sind. – sstan

+0

@Kostya - weil 1/5 zwischen 1/3 und 1/9 sequentiellen Aufzeichnungen vergleicht. – sgeddes

Antwort

1

nicht extrem trivial, aber vorausgesetzt, Sie Zugriff auf window functions so haben wie row_number, dann ist hier eine Option lead und ein outer join:

select a.personid, a.appt_date, 
    case when c.personid is null then 'N' else 'Y' 
    end as follow_up_flag 
from (
     select personid, 
     appt_date, 
     lead(appt_date) over (partition by personid order by appt_date) next_appt_date 
     from tbl_appt 
) a left join tbl_call c on c.personid = a.personid and 
      c.call_date > a.appt_date and 
      (c.call_date < a.next_appt_date or a.next_appt_date is null) 
order by a.appt_date 
+0

Das ist großartig! Das einzige, was ich ändern musste, war der Follow_Up_Flag: Fall, wenn c.call_date null ist, dann 'N' sonst 'Y' Ende als Folge_up_flag :) :) – CurlieQ1034