我有一个如下所示的数据表,我想根据下面提到的条件更新列标志。
declare @tbl table (id int identity ,supergroup int ,subgroup int , flag char(1) )
目标是根据超级组和子组(如40 / count(不同的子组))总共获取前40个记录,其中supergroup = @subgroup 直到40条记录。 假设有3个超级组,如果对于超级组1000,则有3个不同的子组,然后获取40/3 = 13个记录,对于下一个超级组2000,则再次有3个不同的子组 然后从那里获取13条记录,对于下一个超级组3000,如果再次有3个子组,那么40/3 = 13逻辑将仅总计39个所以我需要从最后一个超级组中获得14个。
在任何情况下,我都需要40条记录。
答案 0 :(得分:2)
如果我理解正确,你可以这样做:
select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup, subgroup order by newid());
这将从超级组和子组中进行循环选择,在从同一组获取第二行之前从每个组中返回一行。
编辑:
如果你需要先对超级组进行循环,那么我认为这样做会很好:
select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup order by subgroup, newid());
但是,这可能会从一个subgroup
获得所有结果。让我们再试一次:
select top (40) t.*
from @tbl t
order by row_number() over (partition by supergroup order by newid()),
row_number() over (partition by supergroup, subgroup order by newid());