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;