如何在 select 语句中包含 PERCENTILE_CONT 列而不产生关于 ORDER BY 子句或聚合函数的错误?
How can I include a PERCENTILE_CONT column within a select statement without generating an error about the ORDER BY clause or aggregate function?
我需要根据一些数据生成特定的报告,但我在确定 PERCENTILE_CONT 的正确用法以提供我需要的结果时遇到了很多麻烦。我想在我的查询结果中包含一个列,它显示某个值范围的第 95 个百分位数是什么值。
我有一个table如下:
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
非常简单。
我可以运行下面的查询,没问题:
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;
结果如下:
minimum_sale maximum_sale average_sale
45.75 3266.49 1006.040000
我要查找的是第四列 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;
输出:
customer_id perc_95
1 2981.06
但我似乎无法将它们组合起来 - 这失败了:
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;
输出:
列 'sales.customer_id' 在 select 列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。
我大体上理解这个错误的含义,但我无法弄清楚在这种情况下如何处理它。
我想要的输出:
customer_id minimum_sale maximum_sale average_sale perc_95
1 45.75 3266.49 1006.040000 2981.06
使用window个函数:
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;
非常不方便SQL服务器不支持percentile_cont()
等功能作为聚合功能,需要大家使用select distinct
用于聚合。
不要使用 DISTINCT
。
我会先尝试这个:
select
min(customer_id) AS CustomerID,
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;
如果您收到相同的错误消息,但这次是关于 percentile_cont
,那么也将其包装在 min
函数中:
select
min(customer_id) AS CustomerID,
min(sale_amount) as minimum_sale,
max(sale_amount) as maximum_sale,
avg(sale_amount) as average_sale,
min(percentile_cont(0.95) WITHIN GROUP (order by sale_amount) OVER (partition by customer_id)) as perc_95
from sales
where customer_id = 1;
我需要根据一些数据生成特定的报告,但我在确定 PERCENTILE_CONT 的正确用法以提供我需要的结果时遇到了很多麻烦。我想在我的查询结果中包含一个列,它显示某个值范围的第 95 个百分位数是什么值。
我有一个table如下:
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
非常简单。
我可以运行下面的查询,没问题:
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;
结果如下:
minimum_sale maximum_sale average_sale
45.75 3266.49 1006.040000
我要查找的是第四列 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;
输出:
customer_id perc_95
1 2981.06
但我似乎无法将它们组合起来 - 这失败了:
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;
输出:
列 'sales.customer_id' 在 select 列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。
我大体上理解这个错误的含义,但我无法弄清楚在这种情况下如何处理它。
我想要的输出:
customer_id minimum_sale maximum_sale average_sale perc_95
1 45.75 3266.49 1006.040000 2981.06
使用window个函数:
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;
非常不方便SQL服务器不支持percentile_cont()
等功能作为聚合功能,需要大家使用select distinct
用于聚合。
不要使用 DISTINCT
。
我会先尝试这个:
select
min(customer_id) AS CustomerID,
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;
如果您收到相同的错误消息,但这次是关于 percentile_cont
,那么也将其包装在 min
函数中:
select
min(customer_id) AS CustomerID,
min(sale_amount) as minimum_sale,
max(sale_amount) as maximum_sale,
avg(sale_amount) as average_sale,
min(percentile_cont(0.95) WITHIN GROUP (order by sale_amount) OVER (partition by customer_id)) as perc_95
from sales
where customer_id = 1;