postgresql SQL将表拆分为大小相等的桶,同时保留组

qjp7pelc  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(106)

我有一个table,它有idgroup_id的外键。
我想创建(N=2)个大小相等的桶(大约),这样所有给定group_id的行都在同一个桶中结束。
例如,给定:

id, group_id
1,1
2,1
3,2
4,NULL
5,1
6,2

字符串
我得到:

id, group_id, bucket_id
1,1,1
2,1,1
3,2,2
4,NULL,2
5,1,1
6,2,2


有没有一个简单的方法来实现这一点,我错过了?

3hvapo4f

3hvapo4f1#

您应该能够使用NTILE分析函数

xe55xuns

xe55xuns2#

这将为两个桶做一个大致不错的工作,因为所有like group_id的排名都是相同的,你只需要在中途设置截止点。
当然,这是脆弱的,如果你有一个案例,有10个记录,{group id:count}像{1:9,2:1},它仍然会非常倾斜。
小提琴:https://dbfiddle.uk/lbj5sXgo

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;

字符串

相关问题