比如求每个客户的“平均购买力”。
我们表设计 3 个字段 ( userId,orderId,price )。
但是 price 可能会变动,这条记录会被删除(业务原因)。
为了支持 update\delete,我抗投诉服务器们选择版本折叠树。
主键设置 (userId,orderId)两个字段。
但是我的统计维度却只要 userId (求每个客户的“平均购买力”),如果通过一个维度去聚合 “版本折叠树”,得到的数据又是不准确的。
有什么办法吗?
1. 为什么结果是不准确的 这里没太理解
2. 如果你的描述我理解没错的话 好多 olap 引擎都可以支持这类的聚合统计的 数据不大甚至可以用 mysql (这里可能是我想简单了)
表更新频率数据量?
数据量至少是千万级别,更新频率不算太高
因为 版本折叠树 需要 group by 主键,聚合出来的数据才是准确的
千万级别不需要 clickhouse 吧?我们都是百亿级别的数据,监控类数据,不存在更新
olap 的数据库都不太支持更新 会影响性能
我试了下结果是符合预期的呢,
```sql
CREATE TABLE user_order_price
(
userId UInt64,
orderId UInt8,
price Float64,
sign Int8,
version UInt8
)
ENGINE = VersionedCollapsingMergeTree(sign, version)
ORDER BY (userId,orderId)
INSERT INTO user_order_price VALUES (101, 10000, 100, 1, 1),(101, 10000, 100, -1, 2),(102, 10000, 200, 1, 2)
INSERT INTO user_order_price VALUES (103, 10000, 500, 1, 2)
SELECT
userId,
sum(price * sign) AS avgPrice
FROM user_order_price
GROUP BY userId
```
结果不准确是指哪个位置
sql 中 `group by userId`,但是你的主键是( userId,orderId )。那么 sql 不是按主键对应折叠,`avgPrice`会不对。
数据正确的写法是 `group by userId,orderId`
考虑到后期的数据增长,数据上亿是很快的。
我找到了一个新的写法,搜索之前使用 final 去合并。因为据说现在 final 的性能已经比较好了。
比如:
SELECT
userId,
sum(price * sign) AS avgPrice
FROM user_order_price FINAL
GROUP BY userId
https://cloud.tencent.com/developer/article/1662230
贴错链接了,应该是这个
https://cloud.tencent.com/developer/article/1680925
我想错了,group by 没有说要求一定要是主键