T-SQL: улучшенная функция скользящего распределения / query

мне нужен подход ранжирования T-SQL, аналогичный тому, который предоставляется NTILE (), за исключением того, что элементы каждой плитки будут находиться в скользящем распределении, так что плитки с более высоким рейтингом имеют меньше членов.

Например

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.

Моя лучшая попытка выше будет пропускать процентили и работать плохо. Должен быть способ получше.

6
задан Laramie 10 November 2010 в 20:45
поделиться