将数字列表分为最小和最大范围

时间:2011-12-30 18:48:20

标签: sql-server-2008 tsql

大脑今天不工作,我的谷歌技能让我失望。

我有一列数字,范围从1到1000.我想将100(或我选择的任何)记录范围的最小值和最大值转储到临时表中。计划是使用此临时表在较大的表中处理记录范围(在此示例中一次100个)。

发誓我以前用过CTE做过这件事,但后来我有了分组的东西。在这里,我只想将一个数字列表分解为X的范围。

临时表的输出应如下所示:

Min Max 0 99 100 199 200 299 300 399

谢谢!

3 个答案:

答案 0 :(得分:3)

你可以使用Stuart Ainsworth的这个技巧:

http://codegumbo.com/index.php/2009/01/25/building-ranges-using-a-dynamically-generated-numbers-table/

数字表很棒,但他使用动态生成的数字表,这甚至很棒...... r。

答案 1 :(得分:1)

如果您知道源表中存在所有数字,则可以使用递归CTE生成数字范围:

; with  numbers as
        (
        select  0 as a
        ,       99 as b
        union all
        select  a+100
        ,       b+100
        from    numbers
        where   a < 900
        )
select  *
from    numbers

如果源表格稀疏填充,您可以将其限制为实际存在的数字,如:

... insert CTE from above here ...
select  min(ot.NumberColumn)
,       max(ot.NumberColumn)
from    numbers
left join
        OtherTable ot
on      ot.NumberColumn between numbers.a and numbers.b
group by
        numbers.a

答案 2 :(得分:0)

在这里输入代码我发布了这篇文章之后我一直在玩CTE并提出以下内容,我很想知道它是否适合你。

DECLARE @segment int = 100
;
WITH _CTE
(rowNum, value)
AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY col01) -1, col01
    FROM dbo.testTable
)
SELECT rowNum/@segment AS Bucket, MIN(Value) AS MinVal, MAX(Value) AS MaxVal
FROM _CTE
group by rowNum/@segment
ORDER BY Bucket
;    
在这种情况下,

col01是您想要最小/最大范围值的列,就像TestTable一样。