不在数字范围内的数字循环



有没有一种方法可以为(某个范围中的(记录分配一个数字,当它结束时,它从该范围的第一个数字开始?

我目前有以下表格:

first_number<1><2><1><2><1><2>
id 日期last_numberstart_number
1 2021年1月 1 3 2
1 2021年1月2日3
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日3
1 2021年1月8日3

您可以使用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

最新更新