数据库clickhouse中有这样一个表,表名为market_item_prop_day_record,其中有字段prop_name_id,prop_value_id,item_sale_cnt,item_sale_amt,一个prop_name_id可能对应多个prop_value_id,现在有这样一个需求:求数量最多的top50 prop_name_id下按照sum(item_sale_cnt) 排序前top30的prop_value_id及对应的prop_value_id 的sum(item_sale_cnt),sum(item_sale_amt),请问这样的sql怎么写
时间: 2023-07-22 08:37:24 浏览: 134
你可以使用如下的SQL语句来实现:
```
SELECT prop_name_id, prop_value_id,
SUM(item_sale_cnt) as total_sale_cnt,
SUM(item_sale_amt) as total_sale_amt
FROM market_item_prop_day_record
GROUP BY prop_name_id, prop_value_id
HAVING prop_name_id IN (
SELECT prop_name_id
FROM market_item_prop_day_record
GROUP BY prop_name_id
ORDER BY SUM(item_sale_cnt) DESC
LIMIT 50
)
ORDER BY prop_name_id, total_sale_cnt DESC
LIMIT 30
```
这条SQL语句会先按照prop_name_id分组,然后按照prop_value_id对每个组内的记录进行聚合,计算出每个prop_name_id下每个prop_value_id的总销售数量和总销售金额。接着使用HAVING子句筛选出销售数量最多的前50个prop_name_id,并按照每个prop_name_id下的总销售数量从大到小排序。最后使用LIMIT子句取前30个结果,并按照prop_name_id和总销售数量从大到小排序。这样就能得到每个数量最多的top50 prop_name_id下按照sum(item_sale_cnt)排序前top30的prop_value_id及对应的prop_value_id的sum(item_sale_cnt),sum(item_sale_amt)了。
阅读全文