针对现有sql查询的更好解决方案
我有这样的桌子:针对现有sql查询的更好解决方案,sql,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为3和4的记录)。现在我有了这个解决方案: select *
type | date | id
-----------------------------
1 | 2012-01-01 | 1
2 | 2012-01-01 | 2
1 | 2012-02-02 | 3
2 | 2012-02-02 | 4
我需要构建一个查询,该查询将拾取类型的所有“最新”不同值(在本例中,它将是id为3和4的记录)。现在我有了这个解决方案:
select * from test t1 where date =
(select max(date) from test t2 where t2.type = t1.type ) order by type, date desc
nested select的出现让我很尴尬,也许还有更优雅的解决方案?既然您没有提到您正在使用的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
窗口功能
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
select type, max(date), max(id)
from your_table
group by type
但请注意,只有当您绝对确定日期和ID总是在增加时,它才会起作用。如果不是这种情况,
max(date)
和max(id)
可能位于两个不同的行上。只有当你知道你在做什么时才使用这个!如果不是,则嵌套查询没有问题。哪种RDBMS?例如,对于MySQL来说,这是完美的(imho)。在其他方言中也有其他选择。你真正想问的可能是。。。给定类型的最新日期活动是什么——从而导致返回ID为3和4的记录?您知道,子选择并不是一件坏事?不必感到尴尬;)2DRAP,否,每种类型的最新日期活动+1:这只是同一算法的代数重新安排。然而,应注意的是,一些RDBMS比OPs建议更好地优化了这一点。(我从来都不知道这比老年退休金计划的建议更糟糕。)[我也会+1ROW_NUMBER()。