Прибытие в даты начала и окончания в одной и той же таблице с несколькими заказами через разные идентификаторы пользователей - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть две таблицы: одна с уникальным идентификатором и меткой времени, которая сообщает, когда пользователь впервые зашел в магазин, а другая - с меткой времени уникального идентификатора и списком заказов, размещенных каждым уникальным идентификатором, с их рангами, разделенными уникальным идентификатором, и упорядоченный по размещенным заказам для ранжирования размещенных заказов.

Теперь мне нужен выход, где у меня будет уникальный номер заказа идентификатора и ранг с двумя новыми столбцами времени начала и окончания, где время начала будет первым время в случае, если ранг ордера равен 1, а время окончания будет временем размещения ордера, а для ранга 2 - время начала первого ордера, а время окончания будет временем размещения второго ордера и т. д.

ниже приведены справочные таблицы

Таблица 1

enter image description here

Таблица 2

enter image description here

Финальная таблица

enter image description here

Любые входные данные приветствуются. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Для этого вы можете использовать функции окна:

select t2.id, t2.order_id, t2.order_rank, t2.order_time as end_time,
       coalesce(max(t2.order_time) over (partition by t2.id
                                         order by t2.order_time
                                         range between unbounded preceding and 1 second preceding
                                        ), t1.first_visit
               ) as start_time
from t2 left join
     t1
     on t2.id = t1.id;

Я не уверен, что это быстрее, чем версия self- join.

0 голосов
/ 07 апреля 2020

Вы можете сделать это с помощью самостоятельного объединения:

select 
    t2.id,
    t2.order_id,
    t2.order_rank,
    coalesce(t11.order_time, t2.order_time) start_time,
    t1.order_time end_tume
from table1 t1
inner join table2 t2 
    on t2.id = t1.id
left  join (select distinct order_time, order_rank, id from table1) t11 
    on t11.id = t1.id and t11.order_rank = t1.order_rank - 1

left join пытается привести время заказа "предыдущей" записи, которая совпадает с id. Если он недоступен, мы возвращаемся к дате table2.

...