use*_*134 5 sql sql-server percentile-cont
我需要从一些数据生成特定的报告,并且在弄清楚 PERCENTILE_CONT 的正确用法以提供我需要的结果时遇到了很大的麻烦。我想在查询结果中包含一列,该列显示一系列值中第 95 个百分位的值。
我有一个表如下:
customer_id sale_amount sale_date
1 265.75 2019-09-11 00:00:04.000
1 45.75 2019-09-10 01:00:04.000
1 2124.77 2019-09-10 04:00:04.000
1 66.99 2019-09-10 04:20:04.000
1 266.49 2019-09-09 11:20:04.000
1 3266.49 2019-09-08 11:20:04.000
Run Code Online (Sandbox Code Playgroud)
非常简单。
我可以运行以下查询,没有问题:
select
min(sale_amount) as minimum_sale,
max(sale_amount) as maximum_sale,
avg(sale_amount) as average_sale
from
sales
where
customer_id = 1;
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
minimum_sale maximum_sale average_sale
45.75 3266.49 1006.040000
Run Code Online (Sandbox Code Playgroud)
我想要的是第四列 perc_95,它将计算代表 sale_amount 的第 95 个百分位数的值。
这可以让我获得价值:
select distinct
customer_id,
percentile_cont(0.95) WITHIN GROUP (order by sale_amount) OVER (partition by customer_id) as perc_95
from
sales;
Run Code Online (Sandbox Code Playgroud)
输出:
customer_id perc_95
1 2981.06
Run Code Online (Sandbox Code Playgroud)
但我似乎无法将它们结合起来 - 这失败了:
select distinct
(customer id),
min(sale_amount) as minimum_sale,
max(sale_amount) as maximum_sale,
avg(sale_amount) as average_sale,
percentile_cont(0.95) WITHIN GROUP (order by sale_amount) OVER (partition by customer_id) as perc_95
from
sales
where
customer_id = 1;
Run Code Online (Sandbox Code Playgroud)
输出:
列“sales.customer_id”在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。
我通常理解这个错误的含义,但我无法弄清楚如何在这种情况下处理它。
我想要的输出:
customer_id minimum_sale maximum_sale average_sale perc_95
1 45.75 3266.49 1006.040000 2981.06
Run Code Online (Sandbox Code Playgroud)
使用窗口函数:
select distinct customer_id,
min(sale_amount) over (partition by customer_id) as minimum_sale,
max(sale_amount) over (partition by customer_id) as maximum_sale,
avg(sale_amount) over (partition by customer_id) as average_sale,
percentile_cont(0.95) within group (order by sale_amount) over (partition by customer_id) as perc_95
from sales
where customer_id = 1;
Run Code Online (Sandbox Code Playgroud)
SQL Server不支持聚合percentile_cont()函数等功能,需要人们使用来进行聚合,非常不方便。select distinct