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 и делать джойн с этой вью
Обсуждают сегодня