如何在SQL中选择前10%的值

时间:2017-01-26 15:52:19

标签: sql sql-server

我知道可以用MAX()选择SQL中的最大值,但如果我有一个包含两列,一个ID和一个值的表,是否可以为每个ID选择前10%的值。每个ID都没有设定数量的值。

编辑:抱歉不清楚, 我正在使用Microsoft SQL Server Managment studio。表A看起来像:

ID,     Value
112345, 1
112345, 2
112345, 3
112345, 2
112345, 3
112345, 18
112345, 32
112357, 10
112346, 15
112346, 16

如果要为每个选择前50%,我希望select产生:

ID,     Value
112345, 3
112345, 3
112345, 18
112345, 32
112357, 10
112346, 16

如果返回的行数被舍入,我更愿意,例如。拥有4行的ID的10%仍将返回1值

2 个答案:

答案 0 :(得分:3)

假设你想要按Value(desc)排序的前10%的行,你可以通过使用窗口函数来实现:

select * from (
select ID, Value, COUNT(*) over (partition by ID) as countrows, ROW_NUMBER() over (partition by ID order by Value desc) as rowno from mytable) as innertab
where rowno <= floor(countrows*0.1+0.9)
order by ID, rowno

地板物每1-10行带1行,11-20行带2行,等等。

答案 1 :(得分:0)

或者,您可以使用CROSS APPLY并指定TOP n PERCENT

SELECT x.*
FROM ( SELECT DISTINCT ID FROM tab ) a
    CROSS APPLY ( SELECT TOP 10 PERCENT ID, Value FROM tab b WHERE b.ID = a.ID) x

TOP n PERCENT将产生至少一行。