如何在一个Postgre查询中选择10个值,5个大于5,小于给定值5个?

时间:2015-01-22 18:03:34

标签: sql hibernate postgresql

我有一个有趣的问题要问你:) 假设: 我在Postgres数据库上使用Spring和Hibernate。

我有用户表,每个用户都有它的名字和它的分数。 我希望生成一种排名:给定用户的名称我推断出5个用户得分高于给定用户的用户和5个得分低于此用户的用户:

  • user1 p.105
  • user2 p.104
  • user3 p.103
  • user4 p.102
  • 给定用户p.100
  • user6 p.99
  • user7 p.98
  • ...

我的问题是:是否可以仅在一个查询中创建它?在一个查询中它会更优化和更快吗?你对此类查询有什么建议吗? 在两个查询中执行它非常简单,但我想知道是否有一种方法可以一次完成它?

1 个答案:

答案 0 :(得分:2)

PostgreSQL可以通过单个查询来实现。您可能需要在Hibernate中使用本机(原始)SQL。这是一种方式。

with lowers as (
  select * 
  from test
  where score < (select score from test where user_id = 13)
  limit 5
), highers as (
  select * 
  from test
  where score > (select score from test where user_id = 13)
  limit 5
)
select * from lowers
union all
select * from highers 
union all 
select * from test where user_id = 13
order by score;

如果没有五个分数比目标(user_id = 13)小五个分数,你应该考虑会发生什么。此外,此查询不会引入任何与目标成绩相同的行,这些行可能是您正在寻找的,也可能不是。它也不会尝试将最接近的10行添加到目标。

在我的开发箱上,这不是speedster,这个查询在一百万行的表上运行0.1毫秒。