2013-04-09 68 views
4

我有一張桌子。row_number reset

督促,更改日期
PR1, '是',2012-01-01
PR1, '否',2012-02-01
PR1, '否',2012-03-01
PR1, '是',2012-04-01
PR1, '是',2012-05-01
PR1, '否',2012-06-01

我試圖建立一個qry並使用row_number()函數爲了編號行。我只需要row_number()來重置每次更改列的值爲yes。然後row_number()計算必須從頭開始。像這樣

督促,更改,日期,ROW_NUMBER
PR1, '是',2012-01-01,
PR1, '否',2012-02-01,
PR1, '否',2012-03-01,
PR1, '是',2012-04-01,
PR1, '是',2012-05-01,
PR1, '否',2012-06-01,
...等

是有可能做這樣的事情只使用SQL?我正在查看像row_number()over(按日期排序,prd_prod,更改)之類的窗口函數,但它不起作用。有沒有其他的選擇?

+0

SELECT ROW_NUMBER()OVER(ORDER BY date DESC)也許這會幫助你?嘗試刪除DESC也;) – vivid 2013-04-09 11:29:44

回答

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,你必須添加 「PARTITION BY」

前:

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 2015-04-20 15:58:21

+0

我發佈的解決方案可能對其他人有幫助,但有類似但不完全相同的問題。 – Sameer 2015-04-20 20:13:41