我有这张桌子:
Location date temp
1 12-12-2009 19
1 14-12-2009 21
1 13-12-2009 17
2 12-12-2009 18
2 14-12-2009 16
2 18-12-2009 12
2 15-12-2009 14
现在我想为所有位置选择最新的(最新的日期)行,所以他的例子是第2行和第7行。 我怎么能这样做?
我可以选择最新的1个位置,前1个日期为一个位置,我尝试按位置分组,日期,但后来我想念温度....
亲切的问候, 米歇尔
答案 0 :(得分:10)
看看这个
DECLARE @Table TABLE(
Location INT,
Date DATETIME,
Temp INT
)
INSERT INTO @Table (Location,Date,Temp) SELECT 1, '12 Dec 2009', 19
INSERT INTO @Table (Location,Date,Temp) SELECT 1, '14 Dec 2009', 21
INSERT INTO @Table (Location,Date,Temp) SELECT 1, '13 Dec 2009', 17
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '12 Dec 2009', 18
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '14 Dec 2009', 16
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '18 Dec 2009', 12
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '15 Dec 2009', 14
SELECT t.*
FROM @Table t INNER JOIN
(
SELECT Location,
MAX(Date) MaxDate
FROM @Table
GROUP BY Location
) MaxDates ON t.Location = MaxDates.Location
AND t.Date = MaxDates.MaxDate
ORDER BY 1
您唯一需要注意的是,当给定位置的maxdat可能多次出现时,连接将返回多个位置,日期组合的结果。
您可能想要决定如何选择这些结果中的哪一个或您想要返回的所有结果。
答案 1 :(得分:3)
此:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Location ORDER BY Date DESC) AS rn
FROM mytable
) a
WHERE a.rn = 1
或者这个:
WITH Locations AS
(
SELECT DISTINCT Location
FROM mytable
)
SELECT last.*
FROM Locations
CROSS APPLY
(
SELECT TOP 1 *
FROM mytable
WHERE mytable.Location = Locations.Location
ORDER BY
mydate DESC
) last
如果你没有(Location, Date)
的索引,前者会更有效率,如果你的话,后者会更有效率。
答案 2 :(得分:1)
尝试类似:
SELECT y.location, y.date, y.temp FROM yourTable y
INNER JOIN (
SELECT location, MAX(date) AS latestDate
FROM yourTable
GROUP BY location
) tmp ON y.location = tmp.location AND y.date = tmp.latestDate
ORDER BY y.location
N.B。这假定每个日期仅针对每个位置记录一次。
要了解如何推导出这个,请记住你正在处理集合,所以从简单的位开始:
SELECT location, MAX(date)
FROM yourTable
GROUP BY location
这会为您提供每个位置的最新日期。然后你想要提取这个集合中每个元组的温度。您可以通过结合原始数据并键入每个位置/日期元组来完成此操作。在SQL中,这是两列上的JOIN。
答案 3 :(得分:0)
如何选择Subselect中的最新日期如下:
select * from t where date = (select max(date) from t);