Разделение данных на диапазоны в зависимости от значения - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть диапазон значений данных.Я хочу разбить его на диапазоны, скажем, 3 диапазона, в зависимости от значения.Например: предположим, что мои значения данных выглядят так:

1669
2653
2662
2669
2701
2711
2748
2770
2821
2832
2848
2850
2855
2859
2868
2893
2908
2922
2939
2968
2992
3005
3025
3026
3031
3033
3034
3036
3053
3073
3087
3087
3099
3128
3128
3131
3133
3140
3174
3182
3182
3189
3204
3204
3214
3219
3224
3225
3236
3244
3272
3295
3295
3296
3299
3305
3305
3402

Моя конечная цель - уметь умно определять низкий-средний-высокий из этого набора - это означает, что мне нужен код, чтобы выяснить, какой будет 2хорошие граничные значения - для чего-то вроде <2600,> = от 2600 до 3000,> = 3000.Что-то вроде K-означает кластеризацию ... Набор значений всегда будет меняться, и может быть даже в 10 или 100 с, а не 1000 здесь.

Прикрепленное изображение показывает распределение точек данныхчерез даты на оси х.Визуально становится понятно, как распределяются данные.Я хочу быть в состоянии сделать то же самое с помощью SQL

NTILE в SQL разбивается на равные сегменты и, следовательно, не соответствует моим требованиям.Есть идеи?

1 Ответ

0 голосов
/ 30 апреля 2019

Я не знаю, понял ли я, что вы хотите, но если вы хотите разделить набор данных на 3 группы и найти диапазоны для каждой группы, я думаю, что приведенное ниже поможет при использовании NTILE.

Сначала ядобавит данные в таблицу памяти для проверки, как показано ниже: -

declare @dataSet table ([value] int)
insert into @dataSet values 
(1669 ),(2653 ),(2662 ),(2669 ),(2701 ),(2711 ),(2748 ),(2770 ),(2821 ),(2832 ),(2848 ),(2850 ),(2855 ),
(2859 ),(2868 ),(2893 ),(2908 ),(2922 ),(2939 ),(2968 ),(2992 ),(3005 ),(3025 ),(3026 ),(3031 ),(3033 ),
(3034 ),(3036 ),(3053 ),(3073 ),(3087 ),(3087 ),(3099 ),(3128 ),(3128 ),(3131 ),(3133 ),(3140 ),(3174 ),
(3182 ),(3182 ),(3189 ),(3204 ),(3204 ),(3214 ),(3219 ),(3224 ),(3225 ),(3236 ),(3244 ),(3272 ),(3295 ),
(3295 ),(3296 ),(3299 ),(3305 ),(3305 ),(3402 )

Затем попытается получить диапазоны.

    ;with cte as (
    select NTILE(3) over (order by [value]) [group],[value] from @dataSet
    )
    select [group],min([value]) [LowerRange],max([value]) [HigherRange] From cte group by [group]

Группировка должна получить верхнюю инижний диапазон для каждой группы

Результат будет таким, как показано ниже: -

group   LowerRange  HigherRange
=====   ==========  ==========
1       1669        2968
2       2992        3174
3       3182        3402

надеюсь, это поможет.

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