【发布时间】:2013-06-27 03:45:33
【问题描述】:
我有一个这样的名为 RESULTS 的表:
RESULTS_IDN NAME SUBJECT YEAR QUALIFIED
1 MARK ENGLISH 1989 N
3 MARK ENGLISH 1991 N
5 MARK ENGLISH 1993 Y
7 MARK ENGLISH 1995 N
2 MARK MATH 1990 N
5 MARK MATH 1993 N
6 MARK MATH 1995 Y
4 MARK SCIENCE 1991 N
9 MARK SCIENCE 1997 Y
我需要知道他所写的最新考试的 SUBJECT 的候选人的资格状态,我如何为此编写查询(ORACLE/MSSQL)?
例如输入
NAME,SUBJECT OUTPUT NAME IDN SUBJECT YEAR Q
MARK,ENGLISH OUTPUT MARK 7 ENGLISH 1995 N
MARK SCIENCE OUTPUT MARK 9 SCIENCE 1997 Y
MARK MATH OUTPUT MARK 6 MATH 1995 Y
我知道解决这个问题的一种方法。
(SELECT NAME SUBJECT YEAR MAX(YEAR) YEAR
FROM RESULTS WHERE NAME = 'MARK' AND SUBJECT ='MATH'
GROUP BY NAME SUBJECT YEAR) LATEST
在 IDN 上将上表加入到同一个表中,我可以得到结果。但这是双重工作。无论如何,我可以使用 HAVING CLAUSE 或其他方式获得 MAX(YEAR) 并获得相应的年份吗?我需要对 GROUP BY 数据进行 2 次操作,一个是最新的,一个是对应的 Qualified 状态。
PS : 当然,数据库中有 100 个这样的候选人的记录。
更新:根据答案 2,这个问题也被归类为 greatest-n-per-group 问题。有趣的是知道它是 DB 中的一个分类问题。
【问题讨论】:
标签: sql sql-server oracle group-by greatest-n-per-group