данных в source таблицу, некоторые поля в MV остаются пустыми несмотря на то что данные присутствуют в source таблице.
Есь ордера и их транзакции, необходима сводная таблица (постоянно обновляемая) ордеров и сум транзакций по их типам.
Ордера:
DROP TABLE default.order;
CREATE TABLE default.order
(
`order_purchase_date` DateTime,
`order_id` String,
`quantity` Int32
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(order_purchase_date)
PRIMARY KEY (order_id);
Транзакции:
CREATE TABLE default.transaction
(
`transaction_date` DateTime,
`order_id` String,
`type` String,
`amount` Int64
)
ENGINE = SummingMergeTree((amount))
PARTITION BY toYYYYMM(transaction_date)
PRIMARY KEY (order_id, type);
Сводная таблица в виде materialized_view:
CREATE MATERIALIZED VIEW default.order_mv
(
`order_id` Nullable(String),
`order_purchase_date` DateTime,
`type_1_amount` Nullable(String),
`type_2_amount` Nullable(String)
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(order_purchase_date)
PRIMARY KEY (order_id)
POPULATE
AS
SELECT
o.order_id,
o.order_purchase_date,
t1.amount as type_1_amount,
t2.amount as type_2_amount
FROM default.order AS o
ANY LEFT JOIN (
SELECT sum(amount) as amount, order_id
FROM default.transaction
WHERE type = 'type_1'
GROUP BY order_id, type
) t1 ON (o.order_id = t1.order_id)
ANY LEFT JOIN (
SELECT sum(amount) as amount, order_id
FROM default.transaction
WHERE type = 'type_2'
GROUP BY order_id, type
) t2 ON (o.order_id = t2.order_id)
Добавляем ордер:
INSERT INTO default.order values ('2020-01-01 16:56:01', '123456', 15);
Добавляем две транзкции:
INSERT INTO default.transaction VALUES ('2020-01-01 16:56:01', '123456', 'type_1', 100);
INSERT INTO default.transaction VALUES ('2020-01-01 16:56:01', '123456', 'type_2', 200);
Выборка из default.order_mv дает такой ответ где order_id: null (должно быть "123456"), а order_purchase_date '1970-01-01 00:00:00' (должно быть "2020-01-01 16:56:01"):
order_id: ᴺᵁᴸᴸ
order_purchase_date: 1970-01-01 00:00:00
type_1_amount: 100
type_2_amount: 200
Если выполнять запрос из MV напрямую или создавать MV когда данные уже существуют (применяется POPULATE), или убрать один джойн из MV - получаем ожидаемый результат где oder_id и order_purchase_date заполняются корректно:
o.order_id: 123456
o.order_purchase_date: 2020-01-01 16:56:01
type_1_amount: 100
type_2_amount: 200
Кто нибудь сталкивался с таким, или может подсказать в чем причина подобного поведения?
Версия кликхауса 23.3.4.17
mat view это триггер на инсерт в левую таблицу https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=7597 https://den-crane.github.io/Everything_you_should_know_about_materialized_views_commented.pdf
Обсуждают сегодня