选择计数明智的记录直到极限

时间:2018-05-29 17:51:45

标签: sql sql-server tsql

我有一个如下所示的数据表,我想根据下面提到的条件更新列标志。

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条记录。

1 个答案:

答案 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());