Sql 根据列值从每个组中选择前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

我有一个用例,需要根据列值选择前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%=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?请同时指定预期结果。