我正在使用 Oracle 10g。
我在
的研究
SQL - How to select a row having a column with max value
和
http://jan.kneschke.de/projects/mysql/groupwise-max/
解决如何处理 max(row) 然后找到其他 max(rows) 但是,我还没有。
条件:ID 的 max(enroll_date) 代码必须是“WHEAT”。
我不想要代码为“WHEAT”的最大注册日期。仅当最大注册日期的代码为“WHEAT”时,我才需要该行。
问题:如何编写查询以满足条件?
这不起作用,因为它返回 ID=30,代码 = WHEAT,其中日期 12/25/2001 不是该 ID 的最大(日期)。
select ID, code, max(enroll_date)
from enrollment
where CODE = 'WHEAT'
group by ID, code
这也不起作用,因为它也返回 ID=30,代码 = WHEAT,其中日期 = 12/25/2001。
select ID, code, max(enroll_date)
from enrollment
group by ID, code
having code='WHEAT'
这是我的 table
ENROLLMENT
===========================
ID CODE ENROLL_DATE
--------------------------
01 WHEAT <NULL>
01 WHEAT 12/21/2007
01 WHEAT 7/30/2009
30 WHEAT 12/25/2001
30 CHAFF 6/14/2010
72 WHEAT 8/20/2002
72 WHEAT 12/7/2007
DESIRED RESULT
ID CODE ENROLL_DATE
================================
01 WHEAT 7/30/2009
72 WHEAT 12/7/2007
最佳答案
听起来你想要这样的东西
SELECT id,
code,
enroll_date
FROM (SELECT id,
code,
enroll_date,
rank() over (partition by id
order by enroll_date desc nulls last) rnk
FROM enrollment)
WHERE rnk = 1
AND code = 'WHEAT'
分析函数 RANK
为特定 ID
分配最新的 ENROLL_DATE
值 1,下一个最近的 ENROLL_DATE
对于 ID
值为 2,等等。然后您可以在外部查询中引用排名和代码。如果可能存在重复项,您可能更愿意使用 DENSE_RANK
或 ROW_NUMBER
分析函数
您也可以编写查询
SELECT id,
code,
enroll_date
FROM (SELECT id,
code,
enroll_date,
max(enroll_date) over (partition by id) max_enroll_date
FROM enrollment)
WHERE enroll_date = max_enroll_date
AND code = 'WHEAT'
关于SQL:如果另一列不匹配,如何排除最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446889/