2

假设我想要为表中的每个产品标记 3 条记录。但是,如果某些产品只标记了 1 或 2 条记录,甚至没有标记记录,我怎样才能让它随机标记剩余的记录,每个产品总共有 3 条记录。

前任:

1 条记录被标记为 Product_A,2 条记录被标记为 Product_B,3 条记录被标记为 Product_C。

脚本完成后,我需要为 Product_A 再标记 2 条记录,为 Product_B 再标记 1 条记录。

这可以是循环或 cte 或任何在 sql 中执行此操作的最有效方法。谢谢!

4

2 回答 2

0

在生成数字的派生表中使用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

SQL小提琴

于 2013-08-07T19:43:42.180 回答
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

于 2013-08-07T18:44:13.423 回答