7

我有一张桌子。

prod, change, date
pr1, 'Yes', 2012-01-01
pr1, 'No' , 2012-02-01
pr1, 'No' , 2012-03-01
pr1, 'Yes', 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, 'Yes', 2012-01-01, 1
pr1, 'No' , 2012-02-01, 2
pr1, 'No' , 2012-03-01, 3
pr1, 'Yes ', 2012-04-01, 1
pr1, '是', 2012-05-01, 1
pr1, '否' , 2012-06-01, 2
... 等等

是否有可能只使用 SQL 来做类似的事情?我正在查看诸如 row_number() 之类的窗口函数(按日期排序,prd_prod,更改),但它不是那样工作的。还有其他选择吗?

4

3 回答 3

2

为了重置row_number,您必须添加“PARTITION BY”

前:

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

后:

select RowOrder=ROW_NUMBER() OVER (PARTITION BY WidgetType ORDER BY WidgetTimeCreated)
于 2015-04-20T15:14:51.123 回答
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
于 2013-04-09T12:20:44.900 回答
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 )

于 2013-04-09T12:48:06.757 回答