解决方案:将 key 打散,给 key 增加随机前缀
在进行 group by 之前,先给每个 user_id 增加一个随机前缀,使得原本相同的 user_id 被打散到不同的分组中。
按带前缀的 key 进行分组
对带有随机前缀的 user_id 进行分组和聚合。
去掉前缀后再分组
在第一步的基础上,去掉前缀,再进行一次分组和聚合,得到最终的结果。
插入数据:
CREATE TABLE t_table (
id INT,
key STRING,
value INT
);
INSERT INTO t_table VALUES
(1, 'A', 1),
(2, 'B', 2),
(3, 'A', 3),
(4, 'A', 4),
(5, 'C', 5),
(6, 'D', 6),
(7, 'A', 7),
(8, 'E', 8),
(9, 'F', 9),
(10, 'A', 10);
select *
from t_table;
添加随机前缀:
去掉前缀查询:
select substr(new_key,5) as ori_key,total_value
from (SELECT concat(substr(md5(key),1,4),key) AS new_key, SUM(value) AS total_value
FROM t_table
GROUP BY concat(substr(md5(key),1,4),key)) t1 ;