当前位置: 首页 > 工具软件 > neighbor > 使用案例 >

clickhouse踩坑:neighbor函数结果和预期不一致

葛胜泫
2023-12-01

clickhouse中有个比较好用的函数是neighbor函数,用于排序后取上N行或者下N行,在计算同比环比等指标的时候,还是比较好用的

但是我在使用的过程中,踩过两个坑,结果都是和预期的不一样,希望能写出来给大家避避雷

  1. 踩坑1:

    neighbor函数必须配合order by 使用!

  2. 踩坑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
  )
 类似资料: