Разбить список номеров на минимальные и максимальные диапазоны - PullRequest
3 голосов
/ 30 декабря 2011

Мозг не работает сегодня, и мои навыки Google меня подводят.

У меня есть столбец чисел в диапазоне от 1 до 1000. Я хочу вывести минимальное и максимальное значения для 100 (или что бы я ни выбрал)) диапазон записи во временную таблицу.План состоит в том, чтобы использовать эту временную таблицу для обработки диапазонов записей (в этом примере 100 одновременно) в большой таблице.

Клянусь, я делал это раньше с CTE, но потом мне было что сгруппировать.Здесь я просто хочу разбить один список чисел на диапазоны X.

Вывод из временной таблицы должен выглядеть следующим образом:

Мин Макс 0 99 100 199 200 299 300 399

и т. Д.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 30 декабря 2011

Вы можете использовать этот трюк от Стюарта Эйнсворта:

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

Таблицы чисел - это круто, но он использует динамически генерируемую таблицу чисел, которая даже удивительна ... r.

1 голос
/ 30 декабря 2011

Если вы знаете, что все числа присутствуют в исходной таблице, вы можете использовать рекурсивный 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
0 голосов
/ 31 декабря 2011

введите код здесь У меня была игра с 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 inв этом случае столбец, из которого вы хотите установить минимальные / максимальные значения диапазона, как и TestTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...