Всем привет! Столкнулись со странным поведением MV с агрегатными функциями. MV служит для показа последнего актуального значения по id1, id2. Используется три колонки: argMaxState() с числом, maxState c Date и maxState c DateTime. В исходных данных Date и DateTime всегда за один и тот же день. В итоге обнаружили, что при maxMerge для половины строк Date и DateTime имеют разные даты. При чем проблема именно с Date. Например: DateTime = 2020-06-11 05:00:00, а Date = 2020-03-30. И дата эта строк на 50 отстает от максимальной.
Если запустить запросы из MV вручную на сырых данных, то все ок. Если вставить новую строку, то тоже становится ок. С чем может быть связано, что в состоянии оказались сохранены разные значения дат, да еще и с разных строк?
CREATE MATERIALIZED VIEW tmp.last_value_mv
(`id1` UInt64,
id2
UInt64,
last_value
AggregateFunction(argMax, Float32, Tuple(DateTime, DateTime)),
last_date
AggregateFunction(max, Date),
last_datetime
AggregateFunction(max, DateTime),
id2_part_id
UInt8 DEFAULT id2 % 50) ENGINE = AggregatingMergeTree() PARTITION BY id2_part_id ORDER BY (id1, id2, last_date) SETTINGS index_granularity = 8192
AS
SELECT id1 AS id1,
Id2 AS id2,
argMaxState(value, (last_datetime, created)) AS last_value,
maxState(last_date) AS last_date,
maxState(last_datetime) AS last_datetime,
id2 % 50 AS id2_part_id
FROM tmp.master_table
GROUP BY id1, id2;