假设我想要为表中的每个产品标记 3 条记录。但是,如果某些产品只标记了 1 或 2 条记录,甚至没有标记记录,我怎样才能让它随机标记剩余的记录,每个产品总共有 3 条记录。
前任:
1 条记录被标记为 Product_A,2 条记录被标记为 Product_B,3 条记录被标记为 Product_C。
脚本完成后,我需要为 Product_A 再标记 2 条记录,为 Product_B 再标记 1 条记录。
这可以是循环或 cte 或任何在 sql 中执行此操作的最有效方法。谢谢!
假设我想要为表中的每个产品标记 3 条记录。但是,如果某些产品只标记了 1 或 2 条记录,甚至没有标记记录,我怎样才能让它随机标记剩余的记录,每个产品总共有 3 条记录。
前任:
1 条记录被标记为 Product_A,2 条记录被标记为 Product_B,3 条记录被标记为 Product_C。
脚本完成后,我需要为 Product_A 再标记 2 条记录,为 Product_B 再标记 1 条记录。
这可以是循环或 cte 或任何在 sql 中执行此操作的最有效方法。谢谢!
在生成数字的派生表中使用row_number()
,因此已经具有标志的行首先出现,其余行随机排序并按Product
. 如果随机不是必需的,您可以newid()
从查询中删除。
如果该行尚未标记,则为行号 1-3 设置标记。
update T
set Flag = 1
from (
select Flag,
row_number() over(partition by Product
order by Flag desc, newid()) as rn
from YourTable
) as T
where T.rn <= 3 and
T.Flag = 0
这是一种方法:
;with SelectedIds as(
select
Id,
row_number() over (
partition by ProductCode -- distinct numbering for each Product Code
order by newid() -- random
) as rowno
from ProductLines
)
update p
set IsFlagged = 1
from ProductLines p
join SelectedIds s
on p.id = s.id and
s.rowno <= 3 -- limit to 3 records / product code
;
这是一个完整的样本,包括一些测试数据:http ://www.sqlfiddle.com/#!3/3bee1/6