Как получить минимальное и максимальное время столбца отметки времени на основе временного интервала 30 минут? - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь получить желаемый вывод, который выглядит следующим образом

   Driver_ID|   Interval_Start_Time     |  Interval_End_Time      |    Clocked_In_Time      |   Clocked_Out_Time      |  Score
    232     |  2019-04-02 00:00:00.000  | 2019-04-02 00:30:00.000 | 2019-04-02 00:10:00.000 | 2019-04-02 00:29:00.000 |  0.55

Моя цель - получить идентификатор через 30 минут или каждые полчаса, а их минимальное или самое раннее время синхронизируется имаксимальное или последнее время отключения в те же 30 минут или полчаса.

В данный момент у меня есть запрос

WITH TIME AS
  (SELECT DISTINCT CASE
                       WHEN extract(MINUTE
                                    FROM offer_time_utc)<30 THEN date_trunc('hour', offer_time_utc)
                       ELSE date_add('minute',30, date_trunc('hour', offer_time_utc))
                   END AS interval_start_time,
                   CASE
                       WHEN extract(MINUTE
                                    FROM offer_time_utc)<30 THEN date_add('minute',30, date_trunc('hour', offer_time_utc))
                       ELSE date_add('hour',1, date_trunc('hour', offer_time_utc))
                   END AS interval_end_time
   FROM integrated_delivery.trip_offer_fact offer
   WHERE offer.business_day = date '2019-04-01' )
SELECT DISTINCT offer.Driver_ID,
                offer.region_uuid,
                interval_start_time,
                interval_end_time,
                min(sched.clocked_in_time_utc) AS clocked_in_time,
                max(sched.clocked_out_time_utc) AS clocked_out_time,
                cast(scores.acceptance_rate AS decimal(5,3)) AS acceptance_rate
FROM integrated_delivery.trip_offer_fact offer
JOIN TIME ON offer.offer_time_utc BETWEEN time.interval_start_time AND time.interval_end_time
JOIN integrated_delivery.courier_actual_hours_fact sched ON offer.Driver_ID = sched.Driver_ID
JOIN integrated_product.driver_score_v2 scores ON offer.Driver_ID = scores.courier_id
AND offer.region_uuid = scores.region_id
AND offer.region_uuid = sched.region_uuid
AND offer.business_day = date '2019-04-01'
AND sched.business_day = date '2019-04-01'
AND scores.extract_dt = 20190331
AND offer.region_uuid IN('930c534f-a6b6-4bc1-b26e-de5de8930cf9')
GROUP BY 1,2,3,4,7

Но, похоже, он не дает мне правильное минимальное и максимальное время включения и выключения в этом правильном интервале, как показано ниже,

    driver_uuid  region_uuid   interval_start_time      interval_end_time           clocked_in_time         clocked_out_time      score 
      232              bbv     2019-04-01 14:30:00.000   2019-04-01 15:00:00.000  2019-04-01 14:43:13.140  2019-04-01 22:30:46.043   0.173

Когда я добавляю в эти 2 строки,

JOIN TIME ON sched.clocked_in_time_utc BETWEEN time.interval_start_time AND time.interval_end_time

jOIN TIME ON sched.clocked_out_time_utc BETWEEN time.interval_start_time AND time.interval_end_time

Это дает мне ошибку, так как я не думаю, что это правильно.Как правильно установить минимальное и максимальное значения времени входа и выхода для правильного интервала?Это означает, что я хочу только самое раннее синхронизированное время и самое последнее синхронизированное время в это время начала и конца интервала в полчаса.

Я ценю всех, кто смотрит!Спасибо

...