Tsql从表中获取最新记录

时间:2009-10-07 10:28:40

标签: sql tsql

我有这张桌子:

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个日期为一个位置,我尝试按位置分组,日期,但后来我想念温度....

亲切的问候, 米歇尔

4 个答案:

答案 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);