我有以下查询将数字范围分成多个部分。例如:我的数字范围是200,必须将数字分组为95,但是结果的顺序相反。我已附加了预期的结果
declare @MinValue bigint = 1
declare @MaxValue bigint = 200;
declare @RowsPerGroup bigint =95
declare @RowsPerGroup1 bigint =(@RowsPerGroup-1)
;with src(val,rm) as (
select @MaxValue, (@MaxValue - @RowsPerGroup1) union all
select rm-1, case when rm-1 > @MinValue + @RowsPerGroup1 then rm-1 - @RowsPerGroup1 else @MinValue end from src where rm-1 >= @MinValue
)
select rm as 'Start', val as 'End',[Difference]=(val-rm)+1 from src order by rm asc
option(maxrecursion 0)
当前结果:
Start End Difference
1 10 10
11 105 95
106 200 95
预期结果:
请让我知道哪里做错了
答案 0 :(得分:3)
我的变体:
DECLARE
@MinValue bigint = 1,
@MaxValue bigint = 200,
@RowsPerGroup bigint = 95 -- 300
;WITH cte AS(
SELECT @MinValue [Start],IIF(@RowsPerGroup>@MaxValue,@MaxValue,@RowsPerGroup) [End]
UNION ALL
SELECT [End]+1,IIF([End]+@RowsPerGroup>@MaxValue,@MaxValue,[End]+@RowsPerGroup)
FROM cte
WHERE [End]<@MaxValue
)
SELECT [Start],[End],[End]-[Start]+1 [Difference]
FROM cte
答案 1 :(得分:1)
您可以在公用表表达式的第一行中看到原因:
select @MaxValue, (@MaxValue - @RowsPerGroup1)
这会将(200,106)
插入src
中。然后,第二个选择从现有行开始递减计数。为了适应CTE,请与最大值(包括范围)进行最小值交换,逆算术,反向比较以及任何其他相关交换:
select @MinValue, (@MinValue + @RowsPerGroup1) union all
select val+1, case
when val+1 < @MaxValue - @RowsPerGroup1
then val+1 + @RowsPerGroup1
else @MaxValue
end
from src
where val+1 <= @MaxValue
此特定语句可以分为几部分:
select @MinValue, (@MinValue + @RowsPerGroup - 1) union all
select val + 1, case
when val + @RowsPerGroup < @MaxValue
then val + @RowsPerGroup
else @MaxValue
end
from src
where val < @MaxValue