我有这样的表:
type | date | id
-----------------------------
1 | 2012-01-01 | 1
2 | 2012-01-01 | 2
1 | 2012-02-02 | 3
2 | 2012-02-02 | 4
我需要构建一个能够选择所有"最新"不同的类型值(在此示例中,它将是具有id' s 3和4的记录)。现在我有了这个解决方案:
select * from test t1 where date =
(select max(date) from test t2 where t2.type = t1.type ) order by type, date desc
我对嵌套选择的存在感到尴尬,也许有更优雅的解决方案?
答案 0 :(得分:3)
因为你没有提到你正在使用的RDBMS,所以试试这个。将适用于大多数RDBMS。
SELECT a.*
FROM tableName a
INNER JOIN
(
SELECT type, MAX(DATE) maxDAte
FROM tableName
GROUP BY type
) b ON a.type = b.type AND
a.DATE = b.maxDate
或者如果您的RDBMS支持Window Function
SELECT type, date, id
FROM
(
SELECT type, date, id,
ROW_NUMBER() OVER (PARTITION BY type
ORDER BY date DESC) rn
FROM tableNAme
) s
WHERE rn = 1
答案 1 :(得分:1)
在您的特定示例中,这也可以起作用:
select type, max(date), max(id)
from your_table
group by type
但请注意,只有当您完全确定日期和ID总是在增加时它才会起作用。如果不是这种情况,max(date)
和max(id)
可能位于两个不同的行上。只有当你知道自己在做什么时才使用它!如果没有,嵌套查询没有错。