2016-10-12 6 views
0

У меня есть таблица с двумя столбцами под названием «AllocationTimestamp» и «DeallocationTimestamp» и столбца называетсяSQL - Запуск Calcuation по дате

Многие пользователи «USERID» могут быть выделены в данный момент времени, но после того, как первый пользователь назначенный сеанс начинается, и когда их не назначено пользователем, сеанс заканчивается.

Пример был бы:

User1: 2016-01-01 -> 2016-01-05 
User2: 2016-01-02 -> 2016-01-10 
User1: 2016-01-07 -> 2016-01-15 
User3: 2016-01-03 -> 2016-01-08 

User1: 2016-01-20 -> 2016-01-22 
User2: 2016-01-20 -> 2016-01-25 
User1: 2016-01-25 -> 2016-01-28 

Это должно дать две сессии, где начинается и заканчивается 2016-01-01 по 2016-01-15 и другие начинается на 2016-01-20 и заканчивается в 2016-01-28

Обращаем ваше внимание, что когда пользователь не был освобожден, «DeallocatedTimestamp» имеет значение NULL.

Может кто-нибудь помочь мне скомпоновать некоторый SQL, чтобы получить список сеансов с датами начала и окончания?

Заранее спасибо

ответ

0

Предполагая, что ваша таблица называется Сессии, этот сценарий может дать вам отправную точку ...

with BaseData as 
(
    select * 
     , row_number() over(order by AllocationTimestamp asc) as SeqNo 
    from Sessions 
) 
,Data(UserID, AllocationTimestamp, DeallocationTimestamp, SeqNo, SessionNo) as 
(
    select BD.* 
     , 1 
    from BaseData as BD 
    where (BD.AllocationTimestamp=(select min(AllocationTimestamp) from Sessions)) 

    union all 

    select BD.* 
     , D.SessionNo + case when (BD.AllocationTimestamp between D.AllocationTimestamp and coalesce(D.DeallocationTimestamp,current_timestamp)) then 0 else 1 end 
    from BaseData as BD 
    join Data as D 
     on(BD.SeqNo-1=D.SeqNo) 

) 

select SessionNo 
    ,min(AllocationTimestamp) 
    ,case when max(coalesce(DeallocationTimestamp,current_timestamp))=current_timestamp then null else max(DeallocationTimestamp) end 
from Data 
group by SessionNo 
+0

Спасибо вам большое –

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