Поиск лучших 25% клиентов для каждой группы с использованием T- SQL - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующая временная таблица Клиент

   Customer      Group     Price
     A           Sales     100
     B           Lease     200
     C           Lease     300
     D           Lease     50
     E           Lease     100
     F           Sales     750
     G           Sales     200
     H           Lease     50
     I           Sales     130
     J           Lease     100
     K           Lease     200
     L           Sales     500
     M           Sales     1000
     N           Sales     10
     O           Sales     100

Я хочу найти 25% лучших клиентов для каждой Группы .

Для eq: Продажи имеет в общей сложности 8 клиентов, поэтому топ 25% будет 2. Следовательно, мне нужны 2 лучших клиента для Продажи , которые имеют самую высокую Цена .

Аналогично, для Аренда , у меня всего 7 клиентов, топ 25% будет 1,75, что составляет ~ 2.

Если есть Клиент , который имеет такую ​​же Цена , Клиент , который может быть выше при сортировке. Для уравнения: Заказчик B и K имеют одинаковые Цена из 200, следовательно, следует выбрать B.

Вот желаемый результат:

  Customer      Group     Price
     B           Lease     200
     C           Lease     300
     F           Sales     750
     M           Sales     1000

Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

В SQL Server 2008 вы можете использовать:

select t.*
from (select t.*,
             row_number() over (partition by group order by price desc) as seqnum,
             count(*) over (partition by group) as cnt
      from t
     ) t
where seqnum <= 0.25 * cnt;

Или использовать применить:

select t.*
from (select distinct group from t) g cross apply
     (select top (25) percent t.*
      from t
      order by price desc
     ) t
1 голос
/ 12 марта 2020

Вы можете использовать функции окна:

select customer, grp, price
from (
    select t.*, percent_rank() over(partition by grp order by price desc, customer desc) prn
    from mytable t
) t
where prn < 0.25
order by grp, price

Демонстрация на DB Fiddle :

customer | grp   | price
:------- | :---- | ----:
K        | Lease |   200
C        | Lease |   300
F        | Sales |   750
M        | Sales |  1000

Отредактируйте :

Как правило, percent_rank() доступен в SQL Server 2008, которому вы пометили свой вопрос (насколько он был представлен в версии 2012). Мы можем подражать ему следующим образом:

select customer, grp, price
from (
    select 
        t.*, 
        1.0 
            * rank() over(partition by grp order by price desc, customer desc) 
            / count(*) over(partition by grp) prn
    from mytable t
) t
where prn < 0.25
order by grp, price
...