我知道可以用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值
答案 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将产生至少一行。