【问题标题】:Finding top 25 % customers for each group using T-SQL使用 T-SQL 为每个组查找前 25% 的客户
【发布时间】:2020-06-23 22:52:10
【问题描述】:

我有以下临时表客户

   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:Sales 共有 8 个客户,所以前 25% 将是 2 个。因此我需要 Sales 的前 2 个客户,他们具有最高的 Price

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

如果有一个客户,其价格相同,则可以选择排序较高的客户。对于 eq:客户 B 和 K 的 Price 相同,均为 200,因此应选择 B。

这是所需的输出:

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

谢谢大家。

【问题讨论】:

  • 你做了什么吗???

标签: sql sql-server tsql sql-server-2008 greatest-n-per-group


【解决方案1】:

你可以使用窗口函数:

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

客户 | grp |价钱 :------- | :---- | ----: ķ |租赁 | 200 C |租赁 | 300 F |销售 | 750 中号 |销售 | 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

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2021-04-09
      相关资源
      最近更新 更多