首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Group-By并返回有限结果

SQL Group-By并返回有限结果
EN

Stack Overflow用户
提问于 2014-02-20 18:29:10
回答 2查看 85关注 0票数 0

最近我在一次面试中被问到一个SQL问题。要求是在一个表格中找到“最热情的学生”,其中包含学生的ID、课程号和年数。查询应该返回每年上课次数最多的学生,并且只返回这些记录。(我忽略了不同的学生在给定的一年中上课次数相同的情况,因为我没有得到这样的要求。可能还有其他条件来满足这种关系,所以我已经避免了这种情况,我只想让一个查询来解决这个特殊的情况,在这种情况下,每年没有同样热情的学生)。

之后,我构建了一个小表,试图解决这个查询。我的桌子有三个字段:

代码语言:javascript
复制
CREATE TABLE students (
student_no    INT,
course_no     INT,
year          varchar(4));

(这张桌子真的很简单。我知道一年不应该像这样储存,等等。我不想被挂在桌子的格式上。这只是为了尽可能简单地支持这个练习。)

我创建的数据是:

代码语言:javascript
复制
'1', '1', '2000'
'1', '2', '2000'
'1', '3', '2000'
'2', '1', '2000'
'2', '2', '2000'
'2', '3', '2000'
'2', '4', '2000'
'1', '2', '2001'
'1', '1', '2001'
'1', '3', '2001'
'1', '4', '2001'
'2', '1', '2001'
'2', '2', '2001'
'2', '3', '2001'

...so表示,学生2是2000年最热情的学生,有4门课程**,学生1是2001年最热情的学生,有4门课程。

代码语言:javascript
复制
'1', '4', '2001'
'2', '4', '2000'

我终于开始工作的查询是:

代码语言:javascript
复制
Select * from (
   select max(coursecount), year from
    (select student_no, count(course_no) as coursecount, year
      from students
      group by student_no, year) as internal group by year) as maxes,
        (select student_no, count(course_no) as coursecount, year
          from students
          group by student_no, year) as students
 where maxes.coursecount = students.coursecount
 and maxes.year = students.year

...but,我有种感觉,有一个更好的方法来做这件事。

有人能告诉我一种更优雅的方法吗?用ANSI SQL和2)用Oracle中的分析函数做这件事?

提前谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2014-02-20 18:46:38

假设您使用的是Server 2005+

你可以试试

代码语言:javascript
复制
;WITH Vals AS (
    SELECT year, student_no, COUNT(course_no) Cnt
    FROM students
    GROUP BY  year, student_no
 )
, RowIDS AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY year ORDER BY CNT DESC) RowID
    FROM Vals
)
  SELECT *
  FROM RowIDS 
  WHERE RowID = 1

演示

票数 1
EN

Stack Overflow用户

发布于 2014-02-20 18:53:17

在标准SQL中,您可以尝试:

代码语言:javascript
复制
select year,student_no
from students
group by year,student_no
having count(*) = (
   select max( cnt ) 
   from (
     select count(*) cnt
     from students
     group by year,student_no
   ) x
  )

演示:http://sqlfiddle.com/#!11/41d12/7

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21916478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档