2010-05-06 32 views
2

我有一個實時錶帶有示例數據:編寫SQL來獲得最後的數據

Symbol  Date   Value 
ABC  1/3/2009 03:05:01 327 -- is last data for 'ABC' 
ABC  1/2/2009 03:05:01 326 
ABC  1/2/2009 02:05:01 323 
ABC  1/2/2009 01:05:01 313 
BBC  1/3/2009 03:05:01 458 -- is last data for 'BBC' 
BBC  1/2/2009 03:05:01 454 
BBC  1/2/2009 02:05:01 453 
BBC  1/2/2009 01:05:01 423 

請幫我寫一個SQL返回最後一個數據的所有符號。結果是:

Symbol  Date   Value 
ABC  1/3/2009 03:05:01 327 
BBC  1/3/2009 03:05:01 458 

P/s:我使用的是sql server 2005.而實時數據非常大,請優化sql代碼。

謝謝。

+0

子選擇接受的答案,如果它的符號表,你 – 2010-07-27 06:35:10

回答

2

隨着重要的假設是Value隨着Date增加...

SELECT Symbol, MAX(Date) AS Date, MAX(Value) AS Value 
FROM YourTable 
GROUP BY Symbol 

如果這種假設無法進行,那麼有一個問題,因爲你沒有辦法來唯一地標識行。例如,如果您有一個IDENTITY列,您可以找到每個符號具有最新日期和最高ID的記錄。沒有ID字段,你實際上不知道哪個記錄是最新插入的(如果有2個日期相同),所以必須做類似上面的事情。

如果你將永遠不會有某個符號相同的日期值(即符號+日期一起是唯一的),那麼你可以這樣做:

SELECT s.Symbol, s.Date, s.Value 
FROM YourTable s 
JOIN 
(
    SELECT Symbol, MAX(Date) AS LatestDate 
    FROM YourTable 
    GROUP BY Symbol 
) s2 ON s.Symbol = s2.Symbol AND s.Date = s2.LatestDate 

這不會再去重要,如果價值只有永遠隨着時間增加。

+0

意味着什麼工作?注意:我沒有符號表,並且實時表具有主鍵:符號和日期。請重新填寫你的sql。謝謝。 – 2010-05-06 07:27:01

+0

Typo,我的意思是把「FROM YourTable」 - 你只需要用你的實際表名替換它 – AdaTheDev 2010-05-06 07:54:56

0

答案:

SELECT 
*, 
ROW_NUMBER() OVER 
    (PARTITION BY Symbol 
    ORDER BY Date DESC) Position 
FROM 
TableName 
WHERE 
Position=1 
0

你也可以這樣做

select Symbol, 
     max(Date) as Date, 
     (select Value from YourTable where Symbol = T1.Symbol and Date = max(T1.Date)) as Value 
from YourTable T1 
group by Symbol 
相關問題