当前位置: 首页 > 面试题库 >

在Oracle子查询中通过排序获取排行后的第一行

仉宪
2023-03-14
问题内容

我有一名学生(身份证,姓名,部门,年龄,分数)。我想找到每个系中得分最高(年龄最小的学生)的最小的学生。在SQL Server中,我可以使用以下SQL。

select * from student s1 
where s1.id in 
(select s2.id from student s2 
where s2.department = s1.department order by age asc, score desc top 1).

但是,在Oracle中,不能在子查询中使用order by子句,并且没有limit / top
like关键字。我必须将学生表与自身连接两次以查询结果。在oracle中,我使用以下SQL。

select s1.* from student s1, 
(select s2.department, s2.age, max(s2.score) as max_score from student s2, 
(select s3.department, min(s3.age) as min_age from student s3 group by s3.department) tmp1 where 
s2.department = tmp1.department and s2.age = tmp1.min_age group by s2.department, s2.age) tmp2 
where s1.department =tmp2.department and s1.age = tmp2.age and s1.score=tmp2.max_score

有没有人有任何想法可以简化上述用于oracle的SQL。


问题答案:

试试这个

select * from
  (SELECT id, name, department, age, score,
  ROW_NUMBER() OVER (partition by department order by age desc, score asc) srlno 
  FROM student) 
where srlno = 1;


 类似资料:
  • 问题内容: 我将以下查询与MySQL 5.5(或早期版本)一起使用了多年,没有任何问题: 结果的顺序总是按照我的需要降序。 上周,我刚刚迁移到新的MySQL版本(实际上,我迁移到了MariaDB 10.0.14),现在具有相同数据库的相同查询不再按降序排序。它以升序排序(或使用自然顺序排序,实际上不确定)。 因此,有人可以告诉我这是一个错误还是这是最新版本的MySQL / MariaDB中行为的改

  • 问题内容: 我正在使用内部联接从2个表中查询一些数据。 这是查询, 现在,我只想要每个user_id的第一行。 像这样, 我应该为此使用什么查询? 问题答案: 这应该可以解决问题:

  • 问题内容: 这仅给我一行(第一行): 但是,我想要最近的日期val。我可以这样写第一行: 但是,当我尝试混合两个部分胜利时,它不起作用-显然,“仅选择第一行”逻辑 在 order by 之前 触发,然后order by随后被忽略。 问题答案: 它讨论了如何在oracle数据库上实现MySQL限制,该限制由您的标签判断并发布,即您正在使用的内容。 相关部分是:

  • 问题内容: 在查询中引入ORDER BY子句会增加总时间,这是因为数据库需要对排序结果集进行额外的工作: 将结果元组复制到一些临时内存中 对它们进行排序(希望在内存中,否则使用磁盘) 将结果流式传输到客户端 我想念的是为什么仅从联接表中添加列会产生如此不同的性能。 查询1 查询计划 查询2 与上述相同,但不按 查询计划 编辑:添加了更多详细信息 Postgres版本是 8.4 问题答案: 在排序操

  • 数学成绩从高到低排序 const { field = '' } = ctx.query const fields = ctx.helper.filterFields(field) // 数学成绩从高到低排序 const ret = await Student.findAll({ attributes: fields, order: [ ['math', 'DESC

  • 问题内容: 我在此处查看了Tim Hall的精彩文章,该文章允许您使用自引用实体并使用Oracle中的CTE语法显示分层数据(从顶级节点开始,然后递归返回)。 所以我有看起来像这样的代码: 对于锚行(SQL中的顶层层次结构J1条目,其父级为NULL),我想: 对于递归联接: 如果尝试在UNION ALL语句上方添加ORDER BY语句,则会得到某种无效的SQL语法。 您如何解决此问题,以便最后按层