2013-04-09 2 views
4

테이블이 있습니다.row_number 재설정

자극, 변경, 날짜
PR1, '예', 2012-01-01
PR1, '아니오', 2012-02-01
PR1, '아니오'2012-03-01
PR1, '예'를
PR1 2012-04-01, '예', 2012-05-01
PR1, 2012-06-01

를, '아니오'나는 구축을 위해 노력하고있다 행에 번호를 매기려면 row_number() 함수를 사용하십시오. 그냥 각 변경 시간 열에 값을 yes로 재설정하려면 row_number()가 필요합니다. 그런 다음 row_number() 계산을 처음부터 시작해야합니다. 이

자극, 변경, 날짜, ROW_NUMBER
PR1처럼, 2012-01-01, '예', 1
PR1, 2012-02-01, '아니오', 2
PR1, 2012-03-01, '아니오', 3
PR1 , '예', 2012-04-01, 1
PR1 , '예', 2012-05-01, 1
PR1, '아니오', 2012-06-01, 2
... 등

이 사용하는 경우에만 SQL과 같은 일을 할 수있는 가능성이? row_number()와 같은 창 함수 (date, prd_prod, change에 의한 순서)를보고 있었지만 그렇게 작동하지는 않습니다. 다른 옵션이 있습니까?

+0

OVER (ORDER BY date DESC) OVER (ORDER BY date DESC) 아마도 도움이 될까요? DESC를 제거하여 시도하십시오;) – vivid

답변

1
select *, row_number() over (partition by prod, 
           (case when change = 'No' then (select max(date) from [<YourTable>] where prod = d.prod and change = 'Yes' and date < d.date) 
             else date end) order by date) as rownum 
from [<YourTable>] d 
1

시도 :

with yes as 
(select y.*, row_number() over (partition by prod order by date) yesn 
from mytable y 
where change = 'Yes'), 
yesrange as 
(select c.*, n.[date] next_date 
from yes c 
left join yes n on c.prod = n.prod and c.yesn+1 = n.yesn) 
select m.*, row_number() over (partition by m.prod, r.yesn order by m.date) 
from mytable m 
join yesrange r 
    on m.prod = r.prod and 
    m.[date] >= r.date and 
    m.[date] < coalesce(r.next_date, dateadd(d, 1, m.[date])) 

(SQLFiddle here)

0

ROW_NUMBER를 재설정하기 위해, 당신이 "에 의해 파티션"을 추가해야

전 :

select RowOrder=ROW_NUMBER() OVER (ORDER BY WidgetTimeCreated) 

Af ter :

select RowOrder=ROW_NUMBER() OVER (PARTITION BY WidgetType ORDER BY WidgetTimeCreated) 
+0

열 이름을 업데이트해도이 양식에서 대답이 올바르지 않습니다. 예, 테이블을 "row_number()"를 "재설정"하기 위해 분할해야하지만 다른 방법으로는 테이블을 분할해야합니다. – Pio

+0

내가 게시 한 솔루션은 비슷하지만 정확하지 않은 동일한 문제를 가진 다른 사람들에게 도움이 될 수 있습니다. – Sameer