【问题标题】:Update a field for a specific # of records in SQL Server 2005更新 SQL Server 2005 中特定记录数的字段
【发布时间】:2013-08-09 06:09:15
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 为产品标记哪三条记录是否重要,或者您是否有理由手动选择一两条记录然后随机选择最后一条记录?
  • 首先我运行 cte 以根据表中的标志来标记记录。某些产品可能会标记所有 3 条记录,而有些产品可能会标记不到 3 条。如果首先运行并且没有标记所有 3 条记录,我怎么知道要标记多少条记录才能达到 3。如果所有 3 条记录都被标记,下面会起作用但是如果标记少于 3 个怎么办。

标签: sql sql-server-2005


【解决方案1】:

这是一种方法:

;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

【讨论】:

  • 这适用于我的要求,但让它更有趣。假设我想为每个产品代码标记 1 条记录,其中 shirt_color = red 和 1 条记录,其中 shirt_color 为蓝色,1 条记录在其中 shirt_color 为绿色。如果没有为每个产品代码标记 3 条记录,则随机标记每个产品代码的剩余记录,直到达到标记总数 = 3。
  • @user2635406 很容易解决这个问题,只需将, shirt_color 添加到partition by 子句并在最后一行执行s.rowno &lt;= 1 即可
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多