presto / aws athena - выбрать последнюю версию записи

У меня есть таблица событий заказа, которая состоит из нескольких записей для каждого заказа по мере его заполнения. Некоторые заказы отменяются или возвращаются. Я пытаюсь выбрать последние версии всего заказа, для которого последняя версия имеет статус OrderConfirmed. Я предполагал, что буду использовать следующий SQL, но AWS Athena жалуется, что столбец «latest_order_update.latest_update» не может быть разрешен. Какие-нибудь подсказки?

WITH latest_order_update AS (
  SELECT orderevent_order.unique_id, MAX(orderevent_order.event_time) AS latest_update
  FROM orderevent_order
  GROUP BY orderevent_order.unique_id)
SELECT orderevent_order.unique_id
FROM orderevent_order
WHERE orderevent_order.event_time = latest_order_update.latest_update AND orderevent_order.header_event_name = 'OrderConfirmed'
LIMIT 10;

person sumek    schedule 31.08.2018    source источник


Ответы (1)


Вы можете переписать его с помощью ROW_NUMBER:

WITH cte AS (
 SELECT oo.unique_id,
    ,ROW_NUMBER() OVER(PARTITION BY unique_id ORDER BY event_time DESC) rn
  FROM orderevent_order oo
)
SELECT * 
FROM cte
WHERE rn = 1;

Или обратитесь к cte в FROM/JOIN / подзапросе:

WITH latest_order_update AS (
  SELECT orderevent_order.unique_id, 
     MAX(orderevent_order.event_time) AS latest_update
  FROM orderevent_order
  GROUP BY orderevent_order.unique_id)
SELECT orderevent_order.unique_id
FROM orderevent_order
WHERE orderevent_order.event_time IN (SELECT l.latest_update 
                                      FROM latest_order_update l
                                      WHERE orderevent_order.unique_id 
                                         = l.unique_id)           
  AND orderevent_order.header_event_name = 'OrderConfirmed'
LIMIT 10;

Присоединиться:

WITH latest_order_update AS (
  SELECT orderevent_order.unique_id, 
     MAX(orderevent_order.event_time) AS latest_update
  FROM orderevent_order
  GROUP BY orderevent_order.unique_id)
SELECT orderevent_order.unique_id
FROM orderevent_order
JOIN latest_order_update
  ON orderevent_order.event_time = latest_order_update.latest_update
 AND orderevent_order.unique_id = latest_order_update.unique_id
WHERE orderevent_order.header_event_name = 'OrderConfirmed'
LIMIT 10;
person Lukasz Szozda    schedule 31.08.2018