有没有一种方法可以为(某个范围中的(记录分配一个数字,当它结束时,它从该范围的第一个数字开始?
我目前有以下表格:
id | 日期 | first_numberlast_number | start_number | |
---|---|---|---|---|
1 | 2021年1月 | 1 | 3 | 2 |
1 | 2021年1月2日 | <1>3 | <2>||
1 | 2021年1月3日 | 1 | 3 | 2 |
1 | 2021年1月4日 | 1 | 3 | 2 |
1 | 2021年1月5日 | 1 | 3 | 2 |
1 | 2021年1月6日 | |||
1 | 2021年1月7日 | <1>3 | <2>||
1 | 2021年1月8日 | <1>3 | <2>
您可以使用ROW_NUMBER
来实现这一点,使用模运算符和一些加法:
SELECT id,
date,
first_number,
last_number,
start_number,
ISNULL(NULLIF((ROW_NUMBER() OVER (ORDER BY [date]) + start_number - first_number) % last_number,0),last_number)
FROM (VALUES(1,CONVERT(date,'01/01/2021',103),1,3,2),
(1,CONVERT(date,'02/01/2021',103),1,3,2),
(1,CONVERT(date,'03/01/2021',103),1,3,2),
(1,CONVERT(date,'04/01/2021',103),1,3,2),
(1,CONVERT(date,'05/01/2021',103),1,3,2),
(1,CONVERT(date,'06/01/2021',103),1,3,2),
(1,CONVERT(date,'07/01/2021',103),1,3,2),
(1,CONVERT(date,'08/01/2021',103),1,3,2))V(id,date,first_number,last_number,start_number);
ISNULL
/NULLIF
用于用最后一个值替换0
。
根据您对其他id
值的要求,您可能需要添加PARTITION BY
子句。
请注意,此处的结果与预期结果不匹配,因为在预期结果中,last_number
的值为4
,但在示例数据中为3
。
fiddle
first_number+(start_number-first_number+row_number() over(order by date)-1)%(last_number+1-first_number) as cycle