将相等范围的数字分割成SQL Sever

时间:2019-04-16 07:25:14

标签: sql sql-server

我有以下查询将数字范围分成多个部分。例如:我的数字范围是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

预期结果:

enter image description here

请让我知道哪里做错了

2 个答案:

答案 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