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这将只带回高度日期值的行,可能是所需行的子集,一行,或多行相同的位置。。。