如何选择两列中具有最大值的记录?

时间:2013-11-14 15:08:43

标签: sql oracle

很难为这个问题提出一个可以理解的标题。 我将尝试用一个例子来解释。

首先,我在Oracle DB中有一个简单的表INFO

year      type      message
----      ----      -------
2001      1         cakes are yammy
2003      2         apples are dangerous
2012      2         bananas are suspicious
2005      3         cats are tricky

我需要选择某些类型的最新消息(例如type = 1type = 2):

2001      1         cakes are yammy
2012      2         bananas are suspicious

所以我使用了查询(顺便说一下,在这种情况下它是正确的吗?):

select * from INFO i 
where year = (select max(year) from INFO i_last where i.type = i_last.type) 
and i.type in (1, 2)

但现在我需要在我的INFO表中添加一个新的“quarter”列。并按年和季度选择最新记录。

year      quarter      type      message
----      -------      ----      -------
2001      2            1         cakes are yammy
2012      3            2         onions are cruel
2012      1            2         bananas are suspicious
2005      1            3         cats are tricky

类型1或2的最新记录将是:

2001      2            1         cakes are yammy
2012      3            2         onions are cruel

我无法想象可以做到的查询,并希望你能帮助我。

2 个答案:

答案 0 :(得分:4)

分析功能是你的朋友:

SELECT   MAX( year    ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS year,
         MAX( quarter ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS quarter,
         MAX( message ) KEEP ( DENSE_RANK LAST ORDER BY year ASC, quarter ASC, message ASC ) AS message,
         type
FROM     info
GROUP BY type;

SQLFIDDLE

答案 1 :(得分:1)

试一试:

SELECT i.year, i.quarter, i.type, i.message
FROM INFO i
JOIN INFO iy
    ON i.type = iy.type
JOIN INFO iq
    ON iq.type = iy.type    
WHERE i.type IN (1,2)   
GROUP BY i.year, i.quarter, i.type, i.message   
HAVING i.year = MAX(iy.year) AND i.quarter = MAX(iq.quarter)