使用 T-SQL 为每个组查找前 25% 的客户

Finding top 25 % customers for each group using T-SQL

我有以下临时工 table 客户

   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

我想为每个 Group 找到前 25% 的客户。

对于 eq:Sales 共有 8 个客户,因此前 25% 将是 2 个。因此我需要 Sales[=40= 的前 2 个客户] 拥有最高 价格.

同样,对于 Lease,我总共有 7 个客户,前 25% 是 1.75,即 ~2。

如果有一个 Customer,具有相同的 PriceCustomer 更高在排序中可以选择。对于 eq: Customer B 和 K 的 Price 相同,均为 200,因此应选择 B。

这是所需的输出:

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

谢谢大家

您可以使用 window 函数:

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

Demo on 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

在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