NTILE() tarafından sağlanana benzer bir T-SQL sıralaması yaklaşımına ihtiyacım var, ancak her bir döşemenin üyeleri kayma dağılımında olacak ve böylece daha yüksek sıradaki döşemeler olacak daha az üye var. Örneğin #Rank_table, NTILE (@numGroups) 'deT-SQL: Daha iyi bir kayan dağıtım işlevi/sorgusu
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
için
@numGroups grupların eşit bir şekilde dağılımını oluşturur. İhtiyacım olan şey, kiremit 1'in en az üyeye sahip olduğu @numGroups grupları, 2. karonun kiremit 1'den bir veya daha fazlasına sahip olması, 3. karonun kiremit 2'den 1 veya daha fazlasına sahip olması ...
SQL Server 2008 kullanıyorum. Uygulamada, PERCENTILE sütununun periyodik olarak yüzdesel olarak 1-100 arasında güncellenmesi için milyonlarca satırlık bir kalıcı tabloya karşı çalıştırılacak.
Yukarıdaki en iyi denemem yüzdelikleri atlayacak ve kötü performans gösterecektir. Daha iyi bir yol olmalı.
İstatistikler, büyük bir veri kümesini anlaşılmaya yardımcı olan kısa bir şekilde tanımlamak için kullanılır. Sorularınızdan, veri kümeniz hakkında ne yapmaya çalıştığınızı veya anladığınızdan emin değilsiniz. Yöreler, yüzdelikler vb. Normal dağılımlar için mükemmeldir ve çok az güçlükle aşırı aykırı değerleri ortadan kaldırırlar. Normal dağılımın olduğuna emin misin? Üstel dağılımın olabileceğine benziyor. İşlevler hakkında soru sormak yerine, neyi anlamaya çalıştığınızı söylemek daha yararlı olacaktır. –