Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CUME_DIST и PERCENT_RANK  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Господа, может кто-нибудь доходчиво объяснить, чем отличаются CUME_DIST и PERCENT_RANK

DECLARE @test TABLE (
    DepartmentID INT,
    Salary       INT);
INSERT INTO @test
VALUES (1, 15000),
       (1, 18000),
       (1, 23000),
       (1, 23000),
       (1, 25000);
 
SELECT DepartmentID,
       Salary,
       CumeDist    = CUME_DIST()
                     OVER (PARTITION BY DepartmentID
                               ORDER BY Salary),
       PercentRank = PERCENT_RANK()
                     OVER (PARTITION BY DepartmentID
                               ORDER BY Salary)
  FROM @test;


DepartmentIDSalary CumeDist PercentRank
1 150000.2 0
1 180000.4 0.25
1 230000.8 0.5
1 230000.8 0.5
1 250001 1
30 июн 14, 13:23    [16238261]     Ответить | Цитировать Сообщить модератору
 Re: CUME_DIST и PERCENT_RANK  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @t table ( s char(1), ocenka int )
insert into @t
values ( 'A', 3 )
, ( 'B', 4 )
, ( 'C', 4 )
, ( 'D', 3 )
, ( 'E', 5 )
, ( 'F', 4 )

--percent_rank()
select *
, ( rank - 1. ) / ( cntAll-1 ) as [percent_rank_calc]
from
(
select * 
, percent_rank() over ( order by ocenka ) percent_rank
, rank() over ( order by ocenka ) rank
, count(*) over () cntAll
from @t
) t

--cume_dist()
select * 
, cnt*1./cntAll as [cume_dist_calc]
from
(
select * 
, cume_dist() over ( order by ocenka ) cume_dist
, count(*) over ( order by ocenka ) cnt
, count(*) over () cntAll
from @t
) t
30 июн 14, 13:34    [16238338]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить