Как выдать только одно значение в подзапросе?

есть запрос следующего вида:

SELECT bob.add_date, bob.number_doc, bob.store, 
       bob.id_internet_order_global, bob.income_date, 
       bose.msk_dt, bose.order_state 
FROM bz_orders_backorder bob 
INNER JOIN bz_orders_status_exchange bose 
    ON bose.order_guid = bob.id_internet_order_global
WHERE bose.msk_dt IN (
    SELECT MAX(bz_orders_status_exchange.msk_dt)
    FROM bz_orders_status_exchange
    GROUP BY order_guid 
    )
ORDER BY number_doc, store

Данный запрос должен отбирать в bose.msk_dt и bose.order_state последнее по msk_dt значение для данного id_internet_order_global, вместо этого запрос возвращает строки со всеми order_state и msk_dt Полагаю дело в запросе в блоке WHERE но не могу понять как заставить агрегировать только по одному требуемому order_guid, буду благодарен за помощь

bz_orders_backorder запрос на создание

CREATE TABLE default.bz_orders_backorder
(
    record_uuid UUID DEFAULT generateUUIDv4(),
    add_date Date NOT NULL DEFAULT now(),
    store String NOT NULL,
    id_internet_order_global String NOT NULL,
    number_doc String NOT NULL,
    income_date DateTime NOT NULL
)
    ENGINE = MergeTree
    PARTITION BY toYYYYMMDD(add_date) 
    ORDER BY record_uuid
    TTL add_date + INTERVAL 1 MONTH

bz_orders_status_exchange запрос на создание

CREATE TABLE bz_orders_status_exchange
(
    record_uuid UUID DEFAULT generateUUIDv4(),
    add_dt DateTime NOT NULL DEFAULT now(),
    msk_dt DateTime NOT NULL DEFAULT now(),
    order_guid String NOT NULL,
    order_state String NOT NULL
)
    ENGINE = MergeTree
    PARTITION BY toYYYYMMDD(add_dt) 
    ORDER BY record_uuid
    TTL add_dt + INTERVAL 1 MONTH DELETE 

текущий результат запроса

Заранее благодарю за помощь!

что нужно в итоге:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Nofate

Например, можно предварительно сгруппировать таблицу со статусами, по id заказа, сагрегировав последнюю дату, и связанный с ней статус. А потом уже мержить.

SELECT bob.add_date, bob.number_doc, bob.store,
       bob.id_internet_order_global, bob.income_date,
       bose.last_msk_dt, bose.last_order_state
FROM bz_orders_backorder bob
INNER JOIN
  (SELECT 
     order_guid, 
     max(msk_dt) last_msk_dt, 
     argMax(order_state, msk_dt) last_order_state
   FROM bz_orders_status_exchange bose
   GROUP BY order_guid) bose 
  ON bose.order_guid = bob.id_internet_order_global
ORDER BY number_doc, store

Кроме того, вы можете через VIEW обновлять актуальное состояние заказа в третьей таблице с движком ReplacingMergeTree. Агрегаты, которые в фоне наливаются данными — сильная сторона ClickHouse.

→ Ссылка