2010-10-01 64 views
0

...其中「缺失記錄」與最後記錄的值相同,因此沒有記錄。選擇缺失記錄給定數據的最新值

可能是主觀的,但我希望有一個這樣做的標準化的方式。

因此,假設我在MySQL表中有一堆分析。有一些缺失的信息,但如上所述,這是因爲他們以前的值與當前值相同。

table "table": 

id value  datetime 
1  5   1285891200 // Today 
1  4   1285804800 // Yesterday 
2  18   1285804800 // Yesterday 
2  16   1285771094 // The day before yesterday 

正如你所看到的,我沒有今天的ID 2.

的值。如果我想拉從這個表中的「最近的值」(即1「今日「和2的‘昨天’?,我該怎麼做,我已經通過運行下面的查詢實現它:

SELECT id, value FROM (SELECT * FROM table ORDER BY datetime DESC) as bleh GROUP BY id

,它利用一個子查詢,首先對數據進行排序,然後我靠」 GROUP BY「從ea中選擇第一個值(因爲它是有序的,它是最近的) ch id。但是,我不知道是否推出子查詢是獲得最新價值的最佳方式。

你會怎麼做?

所需的表:

id value  datetime 
1  5   1285891200 // Today 
2  18   1285804800 // Yesterday 

謝謝...

+0

昨天你想要什麼價值? 4或18,或兩者兼而有之? – nos 2010-10-01 15:09:56

+0

好點 - 我已經更新了問題以包含所需的表格。在這種情況下,我需要每個ID的最新值。 – 2010-10-01 15:11:15

回答

1

愛是愛的MySQL通過在一個子查詢中允許的訂單。那不是SQL標準:)

你可以重寫查詢,以標準方式投​​訴允許象:

select * 
from YourTable a 
where not exists 
     (
     select * 
     from YourTable b 
     where a.id = b.id 
     and  a.datetime < b.datetime 
     ) 

如果有,你不能在子查詢裂開重複,你可以group by,然後選擇一個任意值:

select a.id 
,  max(a.value) 
,  max(a.datetime) 
from YourTable a 
where not exists 
     (
     select * 
     from YourTable b 
     where a.id = b.id 
     and  a.datetime < b.datetime 
     ) 
group by 
     a.id 

這個選最大a.value分享最新datetime。現在datetime對於所有重複行都是相同的,但標準SQL不知道這一點,所以您必須指定一種方式從等同日期中選擇。在這裏,我使用的是max,但是min甚至avg也可以。

+0

不錯!好的 - 但我們假設每個ID有多個值,所以我們可以比較並得到「最新」 - 但這不能解釋只有一個值的情況,因爲它不會滿足'a.datetime 2010-10-01 15:44:58

+0

@Julian H. Lam:條件落後於'not exists',所以如果不滿意,它將被包含在結果集中。如果只有一個值,我希望查詢能夠工作。 – Andomar 2010-10-01 15:53:32