** 由于我们用的是clickhouse数据库来处理海量的数据,项目是放在阿里云服务器上面的。每一次连接click house时间较长,为了减少接口时延,尽量将多条数据在一次查询中返回。**
例如,某次需求是展示近一个月收藏商品中月价格极值波动大于50%的商品和它对应的最新一天的日期。(月价格极值波动>0.5 是指至少存在一天日价格极值波动大于0.5的商品,最新一天是指,满足条件的这个商品最近一天大于0.5的日期)。 并且要求这个列表先按照时间倒序排序,再按照如果同一天有多个商品大于0.5,波动值从大到小排序。 已知每个用户最多收藏100个商品,如果用for循环遍历的话,至少得连接clickhouse100次,即使使用多线程操作也会慢。于是我们在商品表中加入unit字段,作为主键。项目要求,我们的主键不是一个id,而是由三个字符串拼起来的,于是我们用😭作为分隔符,拼成string1😭string2😭string3作为唯一主键,也就是刚才的unit字段。之后我们只用将需要查看的商品,拼起来用变成List unites,查询的时候使用
```sql
<select>
select * from trade where unit in
<foreach collections="unites" item="unit" open="(" colse="0" separator=",">
#{unit}
</foreach>
</select>
好,我们接下来再完成上面的需求。首先我们将三个月前那一天作为Date start,今天作为Date end。我们查一个月内只用between start and end就可以了。 然后我们在再总商品表查找价格极值波动大于0.5,且日期最新的一条数据,写成sql:
select *,max(create_time) from trade where extreme_price_fluctuation
> 0.5 and create_time between strat and end group by unit
order by create_time desc,extreme_price_fluctuation desc
就可以了。