首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择表中每个组中最高的前3位。

选择表中每个组中最高的前3位。
EN

Stack Overflow用户
提问于 2014-11-18 06:34:01
回答 3查看 78关注 0票数 1

有一张桌子,里面有老师、年数和课程。我必须找出每组课程中由老师教授的前三名(2005至2010年)。

我把我的表格按课程、年份、老师分类,如果我有,我会统计一下lesson1的课程。

代码语言:javascript
复制
lesson1  year1  teachera 20
lesson1  year1  teacherb 1
lesson1  year1  teacherd 10
lesson1  year1  teachere 5
lesson1  year1  teacherf 0
lesson1  year3  teacherc 1
lesson1  year4  teacherb 8

我必须得到20,10和5的year1和1的year3和8的year4

我有大约40节课

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-18 07:58:27

您应该使用分析功能来实现它。

就像下面

代码语言:javascript
复制
SELECT Lesson, Year, Name, Count
  FROM
(
  select Lesson, Year, Name, Count,
         DENSE_RANK() OVER (PARTITION BY Lesson, Year, Name ORDER BY Count DESC) as RK
  from A
)t
 WHERE RK <= 3;
票数 -1
EN

Stack Overflow用户

发布于 2014-11-18 07:52:02

如果您使用的是Oracle (当您标记问题时),这将起作用:

代码语言:javascript
复制
SELECT *
  FROM
(
  select Lesson, Year, Name, Count,
         ROW_NUMBER() OVER (PARTITION BY Lesson, Year, Name ORDER BY Count DESC) as RN
  from A
)t
 WHERE RN <= 3;

它不会在MySQL中工作(就像您在sqlfiddle中创建它一样),但是我相信您可以在那里做同样的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-11-19 05:27:26

我就是这么干的,谢谢

代码语言:javascript
复制
SELECT Lesson, Year, Name, Count
FROM
(
  SELECT Lesson, Year, Name, Count,
         RANK() OVER (PARTITION BY Lesson, Year, Name ORDER BY Count DESC) 
  as RK
  from A
) t
WHERE RK <= 3;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26988062

复制
相关文章

相似问题

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