Sample Table:
x
Waiter Customer_In_Time Customer_Out_Time Date
Pallavi 10:00 12:00 7/5/2020
Pallavi 13:15 13:50 7/5/2020
Pallavi 15:10 16:35 7/5/2020
Pallavi 10:30 12:00 8/5/2020
Ayush 9:30 10:45 7/5/2020
Ayush 10:30 12:00 8/5/2020
Ayush 13:45 15:00 8/5/2020
I need a column which calculates the time difference of Free time of a day. Example for Pallavi on 7/5/2020 between first customer out time and second customer in time that is 75 mins and if there is only a single customer for a day then the output for that waiter for that day is 0.
Advertisement
Answer
Use lag()
to get the previous out time and then aggregate:
select waiter, date,
coalesce(sum(datediff(minute, prev_cot, customer_in_time)), 0) as free_minutes
from (select t.*,
lag(customer_out_time) over (partition by waiter, date order by customer_in_time) as prev_cot
from t
) t
group by waiter, date;
In older, unsupported versions of SQL Server, you can use apply
:
select waiter, date,
coalesce(sum(datediff(minute, prev_cot, customer_in_time)), 0) as free_minutes
from (select t.*,
tprev.customer_out_time as prev_cot
from t outer apply
(select top (1) t2.*
from t t2
where t2.waiter = t.waiter and t2.date = t.date and
t2.customer_in_time < t.customer_in_time
order by t2.customer_in_time desc
) tprev
) t
group by waiter, date;