Как выдать только одно значение в подзапросе?
есть запрос следующего вида:
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 шт):
Например, можно предварительно сгруппировать таблицу со статусами, по 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.

