很难为这个问题提出一个可以理解的标题。 我将尝试用一个例子来解释。
首先,我在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 = 1
或type = 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
我无法想象可以做到的查询,并希望你能帮助我。
答案 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;
答案 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)