tsql - T-SQL : A better sliding distribution function/query

标签 tsql sql-server-2008 statistics tile

我需要一种类似于 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。

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

最佳答案

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

相关文章:

SQL Server : group_by select active dates

SQL Server - 查询一个奇怪的表

mysql - SQL 中的存储过程用于连接两个表

r - 用于多项回归的多重插补和 mlogit

machine-learning - 随机森林中变量重要性的回归式量化

statistics - 在 Redis 中存储时间相关指标的好方法是什么?

php - jQuery/PHP 失败后

sql - 如何截去小数位而不向上舍入?

sql - 如何在 T-SQL 中标准化混合日期格式的列

sql - 获取从开始到结束日期范围(包括边界)之间的事件行