184 похожих чатов

Приветствую. Столкнулся с очень странным поведением materialized_view - при вставке

данных в 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

1 ответов

7 просмотров

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

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта