Sql 根据列值从每个组中选择前n%的记录
我有一个用例,需要根据列值选择前n%的行 例如:Sql 根据列值从每个组中选择前n%的记录,sql,postgresql,Sql,Postgresql,我有一个用例,需要根据列值选择前n%的行 例如: Id | Group Name | Value 1 | *Group 1* | 10 2 | Group 2 | 20 3 | *Group 1* | 5 4 | *Group 1* | 100 5 | Group 2 | 10 6 | *Group 1* | 150 从每个组中,我需要根据值选择前40%的行 在第1组的情况下,总价值为265 265的40
Id | Group Name | Value
1 | *Group 1* | 10
2 | Group 2 | 20
3 | *Group 1* | 5
4 | *Group 1* | 100
5 | Group 2 | 10
6 | *Group 1* | 150
从每个组中,我需要根据值选择前40%的行
在第1组的情况下,总价值为265
265的40%=106
因此,任何大于106的值都应在组1中返回,因此您可以使用窗口函数:
select t.*
from (select t.*,
sum(value) over (partition by groupname) as total,
sum(value) over (partition by groupname order by value desc) as running
from t
) t
where running - value < 0.4 * total;
这将返回超过40%的第一行。如果要在该行之前显示最后一行,请使用:
where running < 0.4 * total;
您可以使用窗口功能:
select t.*
from (select t.*,
sum(value) over (partition by groupname) as total,
sum(value) over (partition by groupname order by value desc) as running
from t
) t
where running - value < 0.4 * total;
这将返回超过40%的第一行。如果要在该行之前显示最后一行,请使用:
where running < 0.4 * total;
如果您想要排名前40%的数据,那么该数据是否应该达到并包括106?请同时指定预期结果。如果您想要排名前40%的数据,那么该数据是否应该达到并包括106?请同时指定预期结果。