低于21.3版本ClickHouse多分组变量下neighbor函数失效如何实现lag效果
问题原因
你用neighbor()返回结果错误的核心原因是:该函数是基于查询结果集的物理行顺序计算偏移值,你既没有对结果集按分组字段(channel)+ 排序字段(date)显式排序,也没有保证同一渠道的所有行连续排列,自然无法得到同渠道的前一天数值。
正确实现方案
方案1:自连接(兼容性最高,无版本限制,推荐)
逻辑最清晰,不管日期是否连续都可以准确匹配到前一天的数值,适合所有场景:
SELECT t1.date, t1.channel, t1.sum, -- 没有匹配到前一天数据时可自定义默认值,不需要默认值留空直接取t2.sum即可 COALESCE(t2.sum, 0) AS prev FROM example t1 LEFT JOIN example t2 ON t1.channel = t2.channel AND t1.date = t2.date + INTERVAL 1 DAY -- 按你需要的输出顺序排序即可 ORDER BY t1.date DESC, t1.channel ASC
如果你的date字段存储为字符串类型,需要先转成日期类型再计算:
AND toDate(t1.date) = toDate(t2.date) + INTERVAL 1 DAY
方案2:排序+neighbor(仅适合日期连续的场景)
如果能保证每个渠道的日期是连续无断档的,可以先排序保证同渠道行连续,再用neighbor取值:
SELECT date, channel, sum, -- 校验上一行是否为同渠道,避免不同渠道数据串了 IF(neighbor(channel, -1) = channel, neighbor(sum, -1), 0) AS prev FROM ( -- 子查询先按渠道、日期升序排序,保证同渠道行连续、日期从早到晚排列 SELECT date, channel, sum FROM example ORDER BY channel ASC, date ASC ) t
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

