Tsql从表中获取最新记录

Tsql从表中获取最新记录,sql,tsql,Sql,Tsql,我有这张桌子: Location date temp 1 12-12-2009 19 1 14-12-2009 21 1 13-12-2009 17 2

我有这张桌子:

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
现在,我想为所有位置选择最新的(最新日期)行,因此tin的示例第2行和第7行。 我该怎么做

我可以为一个位置选择最新的位置,并为单个位置选择前1个日期,我尝试按位置、日期分组,但我错过了临时

亲切问候,,
米歇尔

在这样的子选择中选择最新日期怎么样:

select * from t where date = (select max(date) from t);
看看这个

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可能不止一次出现时,联接将返回位置、日期组合的多个结果

您可能需要决定如何选择这些结果中的哪一个或所有要返回的结果。

请尝试以下操作:

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
注意:假设每个地点的每个日期只记录一次

要理解如何推导,请记住您处理的是集合,因此从简单的一点开始:

SELECT location, MAX(date)
FROM yourTable
GROUP BY location
这将获取每个位置的最新日期。然后,您需要提取该集合中每个元组的温度。您可以通过结合原始数据并键入每个位置/日期元组来实现这一点。在SQL中,这是两列上的联接。

这是:

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

如果在
(位置、日期)
上没有索引,前者效率更高;如果有索引,后者效率更高。

您可能希望将此问题标记为“sql”,因为您不需要特定于t-sql的功能。除此之外,还应该将列名“date”更改为其他名称,因为它在SQL中是保留字。它可以工作,但可能会给你一个困难的时间。但我也得到答案,即特定的MySql SQL这将只带回高度日期值的行,可能是所需行的子集,一行,或多行相同的位置。。。