簡體   English   中英

row_number重置

[英]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()計算必須從頭開始。 像這樣

prod,change,date,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()這樣的窗口函數(按日期排序,prd_prod,更改),但它不能像那樣工作。 還有其他選擇嗎?

要重置row_number,您必須添加“PARTITION BY”

之前:

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

后:

select RowOrder=ROW_NUMBER() OVER (PARTITION BY WidgetType ORDER BY WidgetTimeCreated)
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

嘗試:

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 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM