2009-10-07 56 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)指數,後者則是,如果你做的更有效率。