抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

我们的数据计算式基于clickhouse的,由于接触clickhouse不久,看官网介绍语法和mysql是类似的,就放心大胆的使用mysql的大量语法,然后遇到了一个很奇怪的问题,也是这个奇怪的问题让我对列式数据库有了更深入的了解。

index

前言

近期项目引入了Clickhouse进行数据计算与展示,今天突然我们的PM同学来问我一个问题,怎么快速获取这十个品牌中GMV各自排名前三的SPU数据。当时想了想,一般情况下这种需求都是使用代码实现的,简直So easy,但是一旦写代码的话就没法快速获取并且以后类似的需求也没法快速响应了。

然后想到了咱们使用的是Clickhouse数据库,它自带很多函数,在经过一段时间的查询以后,发现有一个函数还是比较好用的,正好解决这种典型的分组取TOP的问题,这个函数就是groupArray(x),可以查看以下sql,看它是怎么使用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
select * from  
(select b.bid,b.brand as brand, c[1] as top1,c[2] as top2,c[3] as top3,groupArray(3)(b.spu_name) as c,groupArray(10)(b.gmv) as d,d[1]+d[2]+d[3]+d[4]+d[5]+d[6]+d[7]+d[8]+d[9]+d[10] as gmvsum
from (
select spu_id,spu_name,gmv,us,brand,bid
from spu
where platform_id = 2
and c2_id = 3305
and bid in (1234, 5678, 1903, 41313, 3145, 555, 111, 444, 222, 444)
and multiSearchAny(spu_name, ['精酿啤酒','啤酒精酿'])
and not multiSearchAny(spu_name, ['饮料'])
and effective_date between '2020-09-30' and '2021-02-28'
order by gmv desc)
b group by b.bid,b.brand order by bid) c order by c.gmvsum desc;