在SQL Server分发列表桶我的ID,我想重新排序在处理特定方式的源列表。我原来的表有像10,10,10,10,10,20,20,20,20,30,40,40,50,50,60 ID和与之关联的唯一密钥列表。他们可以以任何顺序。我想通过窗口或循环将它们分发到桶中,以便它们不会发生冲突。我对聚合函数很熟悉,我在数学上遇到了麻烦,无法将其分发。我可以做一个循环,但出于性能方面的原因,如果可能的话,我希望在单个查询中完成。通过窗口或循环处理
我有一个查询获得计数和优先喜欢
Count Id Priority
5 10 1
4 20 2
2 40 3
2 50 4
1 30 5
1 60 6
桶的#是任意的,虽然决定的时间提前。如果是3,我想在第一个周期中id为10,20,40,然后在第二个周期中为10,20,50。如果桶是4,那么首先是10,20,40,50,再次是10,20,40,50。
我表达这个问题的另一种方法是我想通过计数来自新表抢了先X,递减计数,然后抢在下一个X,直到筋疲力尽。
接过解决方案建议,并重新写的,但我仍然在寻找可能的话单个SQL查询的解决方案。
我已经更新了建议循环的位上应该有一点更加优化尚未将其更新到我的实际工作量
declare @bucket int, @b int, @maxrows int
declare @buckets table (fstrEntityHash varchar(100), bucket int)
declare @count table (flngCount int, fstrEntityHash varchar(100))
declare @bucketTemp table (fstrEntityHash varchar(100), bucket int)
select @bucket = 3, @maxrows = 20
insert into @count
select COUNT(1) as flngCount,
fstrEntityHash
from tblTest
group by fstrEntityHash
order by COUNT(1) desc
set @b = 1
while (1 = 1)
begin
insert into @bucketTemp
select top (@bucket) fstrEntityHash, @b
from @count
where flngCount > 0
order by flngCount desc;
if @@rowcount = 0
break
update C
set C.flngCount -= 1
from @count C, @bucketTemp I
where C.fstrEntityHash = I.fstrEntityHash
insert into @buckets
select *
from @bucketTemp
if (select count(1) from @buckets) >= @maxrows
break
select @b = @b + 1
delete from @bucketTemp
end
select * from @buckets
谢谢,但我希望为单个查询解决方案,因为我原来我有几百万或ID的。我会试试看,但看到。 – user417639
对于数百万用户,您需要优化解决方案。后来我将修改我的职务,IHAVE一双想法,但没有时间,现在 –
我已经更新了查询了一下这应该是一个多一点的优化还没有肯定的更新,以我添加了我的真实工作量 – user417639