我需要一种与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 Server2008。实际上,此操作将在可能包含数百万行的永久表上运行,以便定期将PERCENTILE列的百分位数从1-100更新。

我在上面的最佳尝试将跳过百分位数,并且效果不佳。一定会有更好的办法。

最佳答案

A better NTILE implementation?青年汽车

关于tsql - T-SQL : A better sliding distribution function/query,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3928450/

10-13 08:16