大脑今天不工作,我的谷歌技能让我失望。
我有一列数字,范围从1到1000.我想将100(或我选择的任何)记录范围的最小值和最大值转储到临时表中。计划是使用此临时表在较大的表中处理记录范围(在此示例中一次100个)。
发誓我以前用过CTE做过这件事,但后来我有了分组的东西。在这里,我只想将一个数字列表分解为X的范围。
临时表的输出应如下所示:
Min Max 0 99 100 199 200 299 300 399
等
谢谢!
答案 0 :(得分:3)
你可以使用Stuart Ainsworth的这个技巧:
数字表很棒,但他使用动态生成的数字表,这甚至很棒...... 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一样。