2013-08-07 2 views
2

테이블에 각 제품에 플래그가 지정된 3 개의 레코드가 필요합니다. 그러나 일부 제품에서만 1 ~ 2 개 레코드에 플래그가 지정되거나 레코드에 플래그가 지정되지 않은 경우 어떻게 제품 당 총 3 개까지 남은 레코드에 무작위로 플래그를 지정할 수 있습니까?SQL Server 2005의 특정 레코드 수에 대한 필드를 업데이트하십시오.

예 :

한 기록이 PRODUCT_A을 받았습니다 도착은,이 개 기록은 Product_B 신고 된 3 개 기록은 Product_C 신고 된.

스크립트가 완료되면 Product_A에 플래그가 지정된 2 개의 레코드와 Product_B에 대해 1 개의 플래그가 추가로 필요합니다.

이것은 루프 또는 cte 또는 sql에서이 작업을 수행하는 가장 효율적인 방법이 될 수 있습니다. 감사! 여기에 전체 샘플은 테스트 데이터를 포함입니다

;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 
; 

을 :

+0

세 가지 기록이 제품 신고 된, 또는 수동으로 하나 또는 두 개의 레코드를 선택 무작위로 마지막 레코드 (들)을 따기위한 이유가 않는 문제를합니까? – lyrisey

+0

먼저 테이블의 플래그를 기반으로 레코드에 플래그를 지정하기 위해 cte를 실행합니다. 일부 제품은 플래그가있는 3 개 레코드와 3 개 미만인 레코드를 모두 얻을 수 있습니다. 3 개 레코드 모두에 플래그가 지정되지 않으면 먼저 3 개 레코드에 플래그가 지정됩니다. 플래그가 3 개 이상이면 3 개 레코드에 플래그가 지정됩니다 그러나 3 개 미만인 경우에는 어떻게 되나요? – user2635406

답변

0

여기 그것을하는 하나의 방법 http://www.sqlfiddle.com/#!3/3bee1/6

+0

이것은 내가 요청한 것에 적합하지만 더 재미있게 만들 수 있습니다. 제품 코드 당 1 레코드에 shirt_color = red 및 1 레코드를 표시하려면 shirt_color가 파란색이고 1 레코드는 shirt_color가 녹색이어야합니다. 그리고 3 개의 레코드가 각 제품 코드에 대해 플래그가 지정되지 않은 경우, 총 플래그 된 = 3에 도달 할 때까지 각 제품 코드에 대해 나머지 레코드를 무작위로 플래그하십시오. – user2635406

+0

@ user2635406'partition by' 절에', shirt_color'를 추가하고 마지막 행에서's.rowno <= 1'을하면 쉽게 해결할 수 있습니다 – GolfWolf

0

숫자가 아직 가지고있는 행을 생성하는 파생 테이블에서 사용 row_number() 플래그가 먼저오고 나머지는 무작위로 정렬되고 Product으로 파티션됩니다. random이 요구 사항이 아니면 그냥 쿼리에서 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