您可以使用一个外部日期表来实现。首先,创建一个包含所有日期的数据表,例如:

CREATE TABLE all_dates (
  date Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)
ORDER BY date;

然后填充数据表,例如:

INSERT INTO all_dates
SELECT 
  toDate('2021-01-01') + toIntervalDay(number) AS date
FROM 
  numbers(365)

接下来,您可以使用外部日期表来生成每天的数据。例如:

SELECT all_dates.date,
  if(i >= 31, arraySum(arraySlice(total_increase, i-30, 31)), arraySum(arraySlice(total_increase, 1, i))) as total_increase_num
FROM 
  (
    SELECT groupArray(Ds) as t,
      groupArray(app_count) as total_increase
    from (
        SELECT min_Ds as Ds,
          count(distinct AppIdentifier) as app_count
        FROM (
            select AppIdentifier,
              min(Ds) as min_Ds
            from log_iMonkey_iOS_overview
            GROUP BY AppIdentifier
          )
        GROUP BY min_Ds
        order by min_Ds
      ) 
  ) ARRAY
  JOIN all_dates ON all_dates.date >= toDate('monthly_active_new_business.start') AND all_dates.date <= toDate('monthly_active_new_business.end')
  LEFT JOIN t as ts ON ts = all_dates.date
  LEFT JOIN arrayEnumerate(t) as i ON 1
ORDER BY all_dates.date

这将生成包含所有日期的数据,如果某个日期没有数据,则默认赋值为0。

ClickHouse 查询每天数据,缺失日期填充为0

原文地址: https://www.cveoy.top/t/topic/oDlN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录