Как поставить в одном ряду разные значения - PullRequest
0 голосов
/ 06 сентября 2018

это мой стол:

Event           Time    Order           Mission         TimeStamp
arrived         14:50   281475024521271 281475024568005 2017-08-09 14:50:59
nextDelivery    14:51   281475024521271 281475024568005 2017-08-09 14:51:33
arrived         15:27   281475024521271 281475024568005 2017-08-09 15:27:13
nextDelivery    15:28   281475024521271 281475024568005 2017-08-09 15:28:04

И это мой запрос:

with times as(
    select 
        event,
        to_char("timestamp"::timestamptz at time zone 'Europe/Rome', 'HH24:MI') as Time,
        orders,
        mission,
        "timestamp"::timestamptz at time zone 'Europe/Rome' as TimeStamp
    from main_source_execevent
    where orders = '281475024521271'
    and event in ('arrived', 'nextDelivery')
    order by "timestamp"
)
    select 
        case when event = 'arrived' then time end as TimeIN,
        case when event = 'nextDelivery' then time end as TimeOUT,
        orders  
    from Times

И результат запроса:

    TimeIN   TimeOut  Order
    14:50    NULL     281475024521271
    NULL     14:51    281475024521271
    15:27    NULL     281475024521271
    NULL     15:28    281475024521271

То, чего я пытаюсь добиться, - это разместить timein и timeout в одном ряду для заказа. Я не могу понять, как получить этот результат. Вы можете мне помочь?

Желаемый результат:

 TimeIN   TimeOut  Order
 14:50    14:51     281475024521271
 15:27    15:28     281475024521271

РЕДАКТИРОВАТЬ: ДОБАВЛЕННАЯ ИНФОРМАЦИЯ

Соединение должно быть с ближайшей отметкой времени между прибытием и следующей доставкой, поэтому может быть только одна пара тайм-аутов / тайм-аутов, как описано в желаемом результате.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я предполагаю, что порядок и значение миссии важны и должны быть равными с обеих сторон объединения. Функция Distinct on возвращает первую строку для уникальных значений из столбцов внутри скобок. Если вы удалите строку "и mse1.order = 281475024521271" и вернете результат для всех заказов / миссий

select distinct on (mse1.order, mse1.timestamp)
       mse1.timestamp time_in, 
       max(mse2.timestamp) time_out,
       mse1.order
  from main_source_execevent mse1
       main_source_execevent mse2
 where mse1.order = mse2.order 
   and mse1.mission = mse2.mission
   and mse1.event = 'arrived'
   and mse2.event = 'nextDelivery' 
   and mse1.order = 281475024521271
 order by mse1.order, mse1.timestamp, mse2.timestamp
0 голосов
/ 06 сентября 2018

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


Используйте самостоятельное объединение, где условие соединения содержит значение для события "time out" и ограничивает основную таблицу событиями "time in":

select tin."order", 
       tin."timestamp" as time_in, 
       tout."timestamp" as time_out
from main_source_execevent tin 
  left join main_source_execevent tout on tin."order" = tout."order" and tout.event = 'nextDelivery'
where tin.event = 'arrived'  
  and tin.order = 281475024521271

Онлайн пример: http://rextester.com/QMZO32570

С индексом ("order", event) это должно быть достаточно эффективно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...