2013-08-07 3 views
2

Скажите, что я хочу, чтобы для каждого продукта в моей таблице было отмечено 3 записи. Но если некоторые продукты имеют только 1 или 2 записи, отмеченные или даже не отмеченные записями, как я могу сделать ее случайным образом помечать оставшиеся записи до общей сложности 3 на продукт.Обновите поле для определенного количества записей в SQL Server 2005

Ex:

1 запись помечается для PRODUCT_A, 2 записи будет помечена для Product_B и 3 записи будет помечена для Product_C.

После завершения сценария мне понадобится еще две записи, отмеченные для Product_A, и еще 1 для Product_B.

Это может быть цикл или cte или что-то еще самое эффективное средство для этого в sql. Благодаря!

+0

ли это вопрос, который три записи будут помечены для продукта, или у вас есть основания для выбора одного или двух записей вручную, то выбирая последнюю запись (ы) в случайном порядке? – lyrisey

+0

Сначала я запускаю cte для записи флага на основе флага в таблице. В некоторых продуктах могут быть отмечены все 3 записи, а некоторые - меньше 3. Если это выполняется первым, а не все 3 записи попадают под флагом, как я могу узнать, сколько еще флагов для доступа к 3. Ниже будет работать, если будут отмечены все 3 записи но что, если помечено менее 3. – user2635406

ответ

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

+0

Это работает для того, что я просил, но давайте сделаем его более интересным. Скажем, я хочу пометить 1 запись на код продукта с помощью рубашки_color = red и 1 записи, где shirt_color синего цвета и 1 запись, где shirt_color зеленый. И если 3 файла НЕ помечены для каждого кода продукта, то случайным образом помечать оставшиеся записи для каждого кода продукта до тех пор, пока не будет достигнут общий флаг = 3. – user2635406

+0

@ user2635406, который легко можно было бы решить, добавив ', shirt_color' в раздел' partition by' и выполнив 's.rowno <= 1' в последней строке – GolfWolf

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 Fiddle

Смежные вопросы