2

テーブル内の製品ごとに 3 つのレコードにフラグを立てたいとします。しかし、一部の製品にフラグが付けられたレコードが 1 つまたは 2 つしかない場合、またはレコードにフラグが付けられていない場合でも、製品ごとに合計 3 つのレコードまでランダムにフラグを立てるにはどうすればよいでしょうか。

元:

Product_A の 1 つのレコード、Product_B の 2 つのレコード、Product_C の 3 つのレコードにフラグが付けられます。

スクリプトが完了したら、Product_A 用にフラグが立てられた 2 つのレコードと、Product_B 用にさらに 1 つのレコードが必要です。

これは、ループまたは cte など、SQL でこれを行う最も効率的な方法であれば何でもかまいません。ありがとう!

4

2 に答える 2

0

これを行う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

于 2013-08-07T18:44:13.423 に答える
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 に答える