SQL Server: разделение данных на динамические сегменты

Пожалуйста, помогите мне с SQL Server Query, который может динамически объединять данные в диапазоны.

Вот мои исходные данные:

Значение
=======
45

33,5
33,1
33
32,8

25,3
25,2
25,1
25

21,3
21,2
21,1
20,9

12,3
12,2
12,15
12,1
12
11,8

Ожидаемый результат:

Значение ранга
=============
45        1
(среднее значение в этом диапазоне составляет 45)

33,5 2
33,1 2
33 2
32,8      2
(среднее значение составляет 33,1 - любое значение в диапазоне (-10%) от 29,79 до 36,41 (+10%) должно иметь ранг 2)

25,3 3
25,2 3
25,1 3
25 3

21,3 4
21,2 4
21,1      4
20,9      4

12,3 5
12,2 5
12.15 5
12,1 5
12 5
11,8 5

DENSE, RANK и NTILE, похоже, не дают мне такой рейтинг. Диапазон является динамическим и не известен ранее. Любая помощь высоко ценится.

Правило группирования:

Каждое ведро содержит набор данных с отклонением 10% от среднего значения

2 ответа

Вот один из способов:

select val, dense_rank() over (order by cast(val/10 as int) desc) ntile 
from yourtable

использование dense_rank но укажите свои ведра в order by пункт. (Я предполагаю, что это так, как это работает для ваших образцов данных)

Сначала преобразуйте значение в число, имеющее 2 десятичных знака.
Затем используйте CASE выражение для выполнения FLOOR или же ROUND функция на основе первого числа после десятичной точки.
Тогда используйте DENSE_RANK функция для присвоения ранга на основе округленного значения.

запрос

select z.[Value], dense_rank() over(order by z.[val_rounded] desc) as [Rank] from(
    select t.[Value],
    case when substring(t.[Value2], charindex('.', t.[Value2], 1) + 1, 1) > 5 
    then round(t.[Value], 0) else floor(t.[Value]) end as [val_rounded] from(
        select [Value], cast((cast([Value]as decimal(6, 2))) as varchar(50)) as [Value2]
        from [your_table_name]
    )t
)z;

Demo

Другие вопросы по тегам