Мне нужен подход ранжирования T-SQL, аналогичный тому, который предоставляется NTILE(), за исключением того, что члены каждой плитки будут располагаться в скользящем распределении, имеют меньше членов.T-SQL: лучшая функция распределения/запрос на рассылку
Например
CREATE TABLE #Rank_Table(
id int identity(1,1) not null,
hits bigint not null default 0,
PERCENTILE smallint null
)
--Slant the distribution of the data
INSERT INTO #Rank_Table (hits)
select CASE
when DATA > 9500 THEN DATA*30
WHEN data > 8000 THEN DATA*5
WHEN data < 7000 THEN DATA/3 +1
ELSE DATA
END
FROM
(select top 10000 (ABS(CHECKSUM(NewId())) % 99 +1) * (ABS(CHECKSUM(NewId())) % 99 +1) DATA
from master..spt_values t1
cross JOIN master..spt_values t2) exponential
Declare @hitsPerGroup as bigint
Declare @numGroups as smallint
set @numGroups=100
select @hitsPerGroup=SUM(hits)/(@numGroups -1) FROM #Rank_Table
select @hitsPerGroup HITS_PER_GROUP
--This is an even distribution
SELECT id,HITS, NTILE(@numGroups) Over (Order By HITS DESC) PERCENTILE
FROM #Rank_Table
GROUP by id, HITS
--This is my best attempt, but it skips groups because of the erratic distribution
select
T1.ID,
T1.hits,
T.RunningTotal/@hitsPerGroup + 1 TILE,
T.RunningTotal
FROM #Rank_Table T1
CROSS APPLY (Select SUM(hits) RunningTotal FROM #Rank_Table where hits <= T1.hits) T
order by T1.hits
DROP TABLE #Rank_Table
В #Rank_table, NTILE (@numGroups) создает равномерное распределение @numGroups групп. Мне нужны группы @numGroups, в которых у плитки 1 есть наименьшее количество членов, у плитки 2 будет один или более плит 1, у плитки 3 будет 1 или больше, чем у плитки 2 ... у плитки 100 будет больше всего.
Я использую SQL Server 2008. На практике это будет выполняться против постоянной таблицы с потенциально миллионами строк, чтобы периодически обновлять столбец PERCENTILE с ее процентилем от 1 до 100.
Моя лучшая попытка выше пропустит процентили и будет работать плохо. Должен быть лучший способ.
Статистика используется для описания большого набора данных кратким образом, который помогает понять. Из ваших вопросов неясно, что вы пытаетесь сделать или понять о своем наборе данных. Медианы, процентили и т. Д. Отлично подходят для нормальных распределений, и они устраняют экстремальные выбросы с очень небольшими проблемами. Вы уверены, что имеете нормальное распространение? Звучит скорее как экспоненциальное распределение. Было бы более полезно сказать, что вы пытаетесь понять о своих данных, а не спрашивать о функциях. –