default.src (
                  
                  
                      date Date,
                  
                  
                      datetime DateTime,
                  
                  
                      userId UInt64,
                  
                  
                      countryId UInt8,
                  
                  
                      typeId UInt8
                  
                  
                  ) ENGINE = MergeTree(date, (userId, datetime), 8192)
                  
                  
                  
                  
                  
                  CREATE MATERIALIZED VIEW default.src_country
                  
                  
                  (
                  
                  
                      date Date,
                  
                  
                      datetime DateTime,
                  
                  
                      userId UInt64,
                  
                  
                      recordsByCountryMap Nested(
                  
                  
                          countryId UInt8,
                  
                  
                          records UInt64
                  
                  
                      )
                  
                  
                  )
                  
                  
                  ENGINE = SummingMergeTree(date, (date, datetime, userId), 8192)
                  
                  
                  AS
                  
                  
                  SELECT 
                  
                  
                      date,
                  
                  
                      toStartOfMinute(datetime) AS datetime, 
                  
                  
                      userId, 
                  
                  
                      [countryId] as recordsByCountryMap.countryId, 
                  
                  
                      [count()] AS recordsByCountryMap.records
                  
                  
                  FROM default.src 
                  
                  
                  GROUP BY
                  
                  
                      date,
                  
                  
                      datetime, 
                  
                  
                      userId, 
                  
                  
                      countryId
                  
                  
                  
                  
                  
                  В документации движка SummingMergeTree указано, что производится суммирование для столбцов заканчивающихся на 'Map'.
                  
                  
                  Но если данные вставлены в разных пачках, то их суммирует только optimize либо они сами "когда-то" просуммируются.
                  
                  
                  
                  
                  
                  Вопрос - есть ли агрегирующая функция, которая сложит соотвествующие значения по ключам? Или до-агрегацию в таком случае производить на стороне клиента в коде?
                  
                  
                  
                  
                  
                  Пример:
                  
                  
                  SELECT *
                  
                  
                  FROM src_country 
                  
                  
                  
                  
                  
                  ┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
                  
                  
                  │ 2017-01-01 │ 2017-01-01 00:00:00 │      1 │ [10]                          │ [4]                         │
                  
                  
                  └────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
                  
                  
                  ┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
                  
                  
                  │ 2017-01-01 │ 2017-01-01 00:00:00 │      1 │ [10]                          │ [4]                         │
                  
                  
                  └────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
                  
                  
                  ┌───────date─┬────────────datetime─┬─userId─┬─recordsByCountryMap.countryId─┬─recordsByCountryMap.records─┐
                  
                  
                  │ 2017-01-01 │ 2017-01-01 00:00:00 │      1 │ [10,11]                       │ [4,3]                       │
                  
                  
                  └────────────┴─────────────────────┴────────┴───────────────────────────────┴─────────────────────────────┘
                  
                  
                  
                  
                  
                  SELECT 
                  
                  
                      datetime, 
                  
                  
                      groupArray(recordsByCountryMap.countryId), 
                  
                  
                      groupArray(recordsByCountryMap.records)
                  
                  
                  FROM src_country 
                  
                  
                  WHERE userId = 1
                  
                  
                  GROUP BY datetime
                  
                  
                  
                  
                  
                  ┌────────────datetime─┬─groupArray(recordsByCountryMap.countryId)─┬─groupArray(recordsByCountryMap.records)─┐
                  
                  
                  │ 2017-01-01 00:00:00 │ [[10],[10],[10,11]]                       │ [[4],[4],[4,3]]                         │
                  
                  
                  └─────────────────────┴───────────────────────────────────────────┴─────────────────────────────────────────┘
                  
                  
                
@milovidov_an можете с этим помочь? Нашел в исходниках хитрый *ForEach модификатор, попробовал с sumForEach, делает почти то, что нужно, но вероятно не учитывает по каким ключам происходит суммирование. Смотрел также на groupArrayInsertAt, sequenceMatch но похоже не то.
Обсуждают сегодня