2016-09-12 2 views
0

Я пытаюсь заполнить таблицу с личным идентификатором с датой встречи, и был ли выполнен следующий звонок после посещения.Row_Number Диапазон дат

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 

Желаемая Стол: 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 

Tbl_FollowUp.Follow_Up_Flag является = Y, когда Tbl_Call.Call_Date является> Tbl_Appt.Appt_Date и перед следующий апп.

Предполагаю, что я буду использовать Row_Number/Partition, но эти функции сориентируют меня (см. Мои предыдущие сообщения).

Заранее благодарен!

+0

ваш желаемый результат кажется неправильным. почему существует Y рядом с 1/3/2016? – Kostya

+3

Поскольку это не ваш первый вопрос SQL, вы должны убедиться, что очень важно всегда указывать, какую базу данных вы используете. SQL Server? И если да, то какая версия? Он может определять, какие функции окна доступны. – sstan

+0

@ Kostya - потому что 1/5 находится между 1/3 и 1/9, сравнивая последовательные записи. – sgeddes

ответ

1

Не очень тривиальным, но если у вас есть доступ к window functions таких как row_number, то вот вариант с использованием lead и 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

Это замечательно! Единственное, что мне пришлось изменить, это следующий: Follow_Up_Flag: случай, когда c.call_date имеет значение null, а затем «N» else 'Y' end as follow_up_flag :) :) – CurlieQ1034

Смежные вопросы