更好地解决现有的SQL查询问题

时间:2012-11-28 14:43:17

标签: sql

我有这样的表:

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

我对嵌套选择的存在感到尴尬,也许有更优雅的解决方案?

2 个答案:

答案 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)可能位于两个不同的行上。只有当你知道自己在做什么时才使用它!如果没有,嵌套查询没有错。