如何获得每年SQLite的x最佳结果

问题描述 投票:0回答:1

我的解决方案有问题,我找到了这个例子:

(SELECT COUNT(*) FROM person AS b    
WHERE b.group = a.group AND b.age >= a.age) <= 2    
ORDER BY a.group ASC, a.age DESC

(来自:Get top n records for each group of grouped results

但是我需要在一个旧列的基础上创建一个新列,因此我需要进行一些计算,当我尝试添加更多列时,我收到一条错误消息。如果我只是添加满足感,就可以了,例如:

(SELECT COUNT(*) FROM person AS b   
WHERE b.group = a.group AND b.age*100 >= a.age*100) <= 2   
ORDER BY a.group ASC, a.age DESC   

但是当我尝试重命名新列时,AS过多。

我也尝试使用UNION ALL,但是我的SQLite对()不满意。这根本不适合我:

(   
  select *     
  from mytable    
  where `group` = 1   
  order by age desc   
  LIMIT 2   
)   
UNION ALL   
(   
  select *   
  from mytable    
  where `group` = 2   
  order by age desc   
  LIMIT 2   
)   

“结果:”(“附近:语法错误在第1行:(“

即使我在()之前执行SELECT和FROM,我也收到错误消息。

(where `group` = 1   
  order by age desc   
  LIMIT 2)   

UNION ALL   

select * from mytable    
(where `group` = 2   
  order by age desc   
  LIMIT 2)   

“ WHERE”附近:语法错误

请有人能解释一下为什么吗?

sql sqlite variables greatest-n-per-group union-all
1个回答
0
投票

此语法应该起作用:

select * 
from (
  select *     
  from mytable    
  where `group` = 1   
  order by age desc   
  LIMIT 2   
)   
UNION ALL   
select * 
from (   
  select *   
  from mytable    
  where `group` = 2   
  order by age desc   
  LIMIT 2   
);

但是您也可以使用ROW_NUMBER():

select t.`group`, t.age, ....<rest of the columns from mytable> 
from (
  select *, row_number() over (partition by `group` order by age desc) rn
  from mytable
  where `group` in (1, 2)
) t 
where t.rn <= 2
© www.soinside.com 2019 - 2024. All rights reserved.