使用 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,具有相同的 Price,Customer 更高在排序中可以选择。对于 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
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
我有以下临时工 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,具有相同的 Price,Customer 更高在排序中可以选择。对于 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
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