Нужна помощь в расчете количества 90-минутных таймфреймов, доступных для двух разных таймфреймов ежедневно - PullRequest
0 голосов
/ 19 марта 2020

Я использую PostgreSQL, и мне нужно вычислить количество 90-минутных windows, которое репетитор имеет в своем расписании. Я отвечаю на этот вопрос ежедневно, но проблема, с которой я сталкиваюсь, заключается в том, что я хочу получить номер 90 минут windows с 6:00 до 15:00 и номер 90 минут windows с 15:00 до 21:00.

1002 * Например, если бы репетитор был доступен с 13:00 до 17:00, я бы хотел, чтобы он показывал ОДНО 90-минутное окно из 6a-3p и ОДИН 90-минутное окно из 3p-9p. В моем запросе он рассчитывает ДВА (или оба) 90-минутный windows под утренним 6a-3p таймфреймом. Логично, я знаю, ПОЧЕМУ он делает это, но я не знаю, как это исправить.

Мои данные настроены на [start_at] (метка времени без часового пояса) и [duration] (в минутах ). Таким образом, для доступности с 13:00 до 17:00: Start_at = '13: 00: 00 'и продолжительность = 240. Я рассмотрел создание и [конец_кат] по dateadd (мин, длительность, начальный_кат) как конец_ат, чтобы помочь с этим расчетом - но все еще потерян.

Ниже приведен запрос, который я использовал. Заранее благодарю за помощь!

select 
  SUM(sun_am) as "SUNDAY 6AM-3PM"
, SUM(sun_pm) as "SUNDAY 3PM-9PM"
, SUM(mon_am) as "MONDAY 6AM-3PM"
, SUM(mon_pm) as "MONDAY 3PM-9PM"
, SUM(tues_am) as "TUESDAY 6AM-3PM"
, SUM(tues_pm) as "TUESDAY 3PM-9PM"
, SUM(wed_am) as "WEDNESDAY 6AM-3PM"
, SUM(wed_pm) as "WEDNESDAY 3PM-9PM"
, SUM(thur_am) as "THURSDAY 6AM-3PM"
, SUM(thur_pm) as "THURSDAY 3PM-9PM"
, SUM(fri_am) as "FRIDAY 6AM-3PM"
, SUM(fri_pm) as "FRIDAY 3PM-9PM"
, SUM(sat_am) as "SATURDAY 6AM-3PM"
, SUM(sat_pm) as "SATURDAY 3PM-9PM"
from (
select 
case when d.day_of_week=7 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as sun_am
, case when d.day_of_week=7 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as sun_pm
, case when d.day_of_week=1 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as mon_am
, case when d.day_of_week=1 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as mon_pm
, case when d.day_of_week=2 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as tues_am
, case when d.day_of_week=2 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as tues_pm
, case when d.day_of_week=3 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as wed_am
, case when d.day_of_week=3 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as wed_pm
, case when d.day_of_week=4 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as thur_am
, case when d.day_of_week=4 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as thur_pm
, case when d.day_of_week=5 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as fri_am
, case when d.day_of_week=5 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as fri_pm
, case when d.day_of_week=6 and datepart(hour, t1.starts_at) between 6 and 14 then SUM(t1.spots) end as sat_am
, case when d.day_of_week=6 and datepart(hour, t1.starts_at) between 15 and 20 then SUM(t1.spots) end as sat_pm
from (
select a.employee_id, a.starts_at, a.duration
, case when a.duration between 90 and 179 then 1
when a.duration between 180 and 269 then 2
when a.duration between 270 and 359 then 3
when a.duration between 360 and 449 then 4
when a.duration between 450 and 539 then 5
when a.duration between 540 and 630 then 6
else null end as spots
from dw.availabilities a
where 1=1
and a.duration>=120
and a.consumed_by_id is null
)t1
join rp_bi.dates d on d.full_date=t1.starts_at::date
group by day_of_week, starts_at
)t2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...