2009-10-07 26 views
2

获取最新记录,我有这个表: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日为一个位置,我试图通过地点,日期分组但后来我错过了临时....

亲切的问候, 米歇尔

+0

您可能想要标记此问题“sql”,因为您不需要T-SQL特定的功能。除此之外,您应该将列名“date”更改为其他内容,因为它是SQL中的保留字。它的工作原理,但可能会让你很难。 – 2009-10-07 10:37:28

+0

但后来我也得到答案与​​ie特定的MySql sql – Michel 2009-10-07 11:44:39

回答

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可能会多次激活,连接将为位置,日期组合返回多个结果。

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

0

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

select * from t where date = (select max(date) from t); 
+0

这将只带回高度日期值的行,可能是所需行的一个子集,单行或具有相同位置的多行... – 2009-10-07 10:42:41

+0

哦,我明白了,我错了... – 2009-10-07 13:16:03

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 

注:这假设每个日期只在每个位置记录一次。

要了解如何导出,请记住你在处理台,所以用简单的位开始:

SELECT location, MAX(date) 
FROM yourTable 
GROUP BY location 

这让你最近的每个位置的日期。然后你想提取这个集合中每个元组的温度。您可以通过结合原始数据并键入每个位置/日期元组来完成此操作。在SQL中,这是两列上的JOIN。

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)指数,后者则是,如果你做的更有效率。