如何选择查询结果的特定行

时间:2016-06-22 05:32:22

标签: sql oracle greatest-n-per-group

我的Oracle数据库中有一个下表:

enter image description here

如何选择大多数学生完成的课程? 我正在尝试以下SQL查询中的多个变体,但它不起作用 -

var ref = new Firebase("firebase url");

3 个答案:

答案 0 :(得分:1)

由于这是一个Oracle数据库,我认为以下内容应该可行

SELECT * FROM
(select count(course) as pcourse, course 
from studies 
group by course 
order by pcourse dec)
WHERE ROWNUM <= 1
  

回复评论

这是因为rownum 顺序分配给返回的行。

所以假设你把ROWNUM = 2,你的查询将返回第一行,暂时给它rownum为1.但由于它与条件ROWNUM = 2不匹配,它将被丢弃。然后它将继续获取第二行,并给它rownum 1,然后循环继续。

如果你想获得第N行,你可能会这样做

SELECT pcourse, course FROM
(select count(course) as pcourse, course, rownum as rn 
from studies 
group by course 
order by pcourse dec)
WHERE rn = N

其中N是必需的行。

答案 1 :(得分:1)

您需要使用rownum,这相当于TOP 1(来自SQL Server)或LIMIT 1(来自MySQL)。

select *
from 
    (select count(course) as pcourse
        , course
    from studies
    group by course
    order by pcourse desc) result_set
where rownum = 1

在较高级where rownum = 1中使用SELECT非常重要,因为Oracle要求您先对结果集进行排序,然后才会过滤行。

否则,如果您将where rownum = 1条件包含在与获取数据的SELECT相同的级别中,那么它将立即过滤到1行(它找到的第一行)并对其进行排序(这没有任何意义,因为它只会是一行)。

根据 @a_horse_with_no_name 的评论,显然Oracle让您可以在同一级别TOP 1中编写SELECT过滤条件,如下所示:

select count(course) as pcourse
    , course
from studies
group by course
order by pcourse desc
fetch first 1 rows only;

答案 2 :(得分:1)

这应该可以,但是我没有创建你的测试数据,因为它是在图片中,请在下次包含为文本

SELECT
   course
   ,COUNT(*) AS pcourse
FROM
   Studies
GROUP BY
   course
ORDER BY
   COUNT(*) DESC
FETCH FIRST ROW ONLY

我仍然不确定如何获取第一行/选择前1 /限制1为Oracle,但@ a-horse_with_no_name正在教学,我正在学习,所以这里是刺。这是offestfetch http://docs.oracle.com/javadb/10.5.3.0/ref/rrefsqljoffsetfetch.html

上的Oracles语法链接