这种方法对于将数据分为两个桶来说能基本完成任务,因为在相同的 group_id
下,它们的排名会一样,您只需设定一个中间的截断点。当然,这种方法并不稳健,如果有如下情况:存在10条记录,其 {group id: 计数}
如 {1: 9, 2: 1}
,那么分桶结果仍然会很不均衡。
下面是一个演示示例,在 fiddle 网站上可运行:
-- 创建测试数据表
CREATE TABLE some_test_data (
id INTEGER,
group_id INTEGER
);
-- 插入测试数据
INSERT INTO some_test_data VALUES
(1, 1),
(2, 1),
(3, 3),
(4, 3),
(5, 4),
(6, 5),
(7, 5),
(8, 5),
(9, 6),
(10, 7);
-- 按照指定逻辑分配桶编号
SELECT *,
CASE
WHEN RANK() OVER (ORDER BY group_id) < COUNT(1) OVER () / 2 THEN 1
ELSE 2
END AS bucket
FROM some_test_data;