clickhouse中有个比较好用的函数是neighbor函数,用于排序后取上N行或者下N行,在计算同比环比等指标的时候,还是比较好用的
但是我在使用的过程中,踩过两个坑,结果都是和预期的不一样,希望能写出来给大家避避雷
踩坑1:
neighbor函数必须配合order by 使用!
踩坑2:
neighbor函数本质上只是在每一个数据存储块中进行排序,并没有对所有数据进行排序!!
所以,
你有可能同一段使用到neighbor函数的SQL,前后两次执行的结果不一样,那是因为clickhouse后台在合并数据块,刚开始是两个数据块的数据,后来被合并成一个了,结果自然不一样
你还可能发现,哎?明明这个不应该出现的结果,为什么会出现了?那是因为,你看到的数据不在一个数据块里,没有参与一起排序,自然结果和你预期的不一样~~~~
怎么办呢?
先试用一些函数,将不同节点不同数据块的数据,先取到一个节点的内存里,再进行排序后取neighbor,就OK了
我经常用group by 函数
举个例子:
原SQL
select col1, col1 - neighbor(col1,-1) from (
select co1,col2
from table1
order by col2
)
优化后SQL:
select col1, col1 - neighbor(col1,-1) from (
select co1,col2
from
(
select col1, col2
from table1
group by col1 ,col2
)
order by col2
)