Tôi cần một phương pháp xếp hạng T-SQL tương tự như phương thức NTILE cung cấp(), ngoại trừ các thành viên của mỗi ô sẽ có phân phối trượt sao cho xếp hạng cao hơn có ít thành viên hơn.T-SQL: Một chức năng phân phối/truy vấn trượt tốt hơn
Ví dụ
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
Trong #Rank_table, NTILE (@numGroups) tạo ra một phân bố của các nhóm @numGroups. Những gì tôi cần là các nhóm @numGroups nơi các tile 1 có các thành viên ít nhất, tile 2 sẽ có một hoặc nhiều hơn 1 tile, tile 3 sẽ có 1 hoặc nhiều hơn tile 2 ... tile 100 sẽ có nhiều nhất.
Tôi đang sử dụng SQL Server 2008. Trong thực tế, thao tác này sẽ được chạy trên bảng vĩnh viễn với hàng triệu hàng có thể để cập nhật định kỳ cột PERCENTILE với phần trăm từ 1-100.
Nỗ lực tốt nhất của tôi ở trên sẽ bỏ qua phần trăm và hoạt động kém. Phải có cách tốt hơn.
Thống kê được sử dụng để mô tả một tập dữ liệu lớn theo cách gọn gàng nhằm hỗ trợ sự hiểu biết. Nó không rõ ràng từ câu hỏi của bạn những gì bạn đang cố gắng làm hoặc hiểu về tập dữ liệu của bạn. Medians, percentiles vv là tuyệt vời cho các bản phân phối bình thường và họ loại bỏ các ngoại lệ cực kỳ với rất ít rắc rối. Bạn có chắc là bạn có phân phối bình thường không? Nghe có vẻ giống như bạn có thể có một phân phối mũ. Sẽ hữu ích hơn khi nói những gì bạn đang cố gắng hiểu về dữ liệu của bạn hơn là hỏi về các chức năng. –