mat view запросе делал join на самого себя? Есть ReplacingMergeTree с возможными дубликатами + колонкой is_deleted. Нужно поддерживать таблицу считающую количество записей без дублей и с учетом is_deleted.
исходная таблица:
CREATE TABLE ts_data
(
`device_id` UInt32,
`data_item_id` UInt32,
`data_time` DateTime64(3, 'UTC'),
`data_value` Float64,
`is_deleted` Bool CODEC(ZSTD),
`ingestion_time` DateTime64(3, 'UTC')
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(data_time)
ORDER BY (device_id, data_item_id, data_time);
mat view, data_time - первый день месяца, count - колич записей в этом месяце для пары device_id, data_item_id
CREATE TABLE idx_ts_data (
`device_id` UInt32,
`data_item_id` UInt32,
`data_time` Date,
`count` SimpleAggregateFunction(sum, Int64)
)
ENGINE = AggregatingMergeTree()
PARTITION BY tuple()
ORDER BY (device_id, data_item_id);
CREATE MATERIALIZED VIEW idx_ts_data_mv
TO idx_ts_data AS
SELECT
device_id,
data_item_id,
toDate(toStartOfMonth(data_time)) AS data_time,
sum(
if(
is_deleted,
-- new data is a deleted marker
if(existing.device_id > 0 and existing.is_deleted == false, -1, 0), -- same row does not yet exist or is already deleted - do not decrease counter
-- not a delete marker
if(existing.device_id > 0 and existing.is_deleted == false, 0, 1) -- if same not deleted row exists - do not increase counter
)
) AS count
FROM
(
select * from ts_data AS new_data
LEFT ANY JOIN ts_data AS existing FINAL ON -- FINAL collapses existing duplicates
(existing.device_id = new_data.device_id) AND
(existing.data_item_id = new_data.data_item_id) AND
(existing.data_time = new_data.data_time)
)
GROUP BY
device_id,
data_item_id,
data_time;
мои ожидания - в new_data данные из insert блока, в existing - существующие данные из таблицы. реальность - как будто бы для обоих сторон join’а только данные из нового блока. потому что sum всегда получается нулевая. как исправить/переписать запрос?
так и задумано, можно обдурить кх и сделать view as select * from ts_data и делать джойн с этой вью
Обсуждают сегодня