2014-02-16 70 views
2

我試圖想出一個數據庫查詢,我真的很掙扎,不僅要讓它工作,而且要找到一個類似的查詢我可以基於它。在Android開發中,我對SQLite頗爲陌生。SELECT爲每個ID包含第一行和最後一行的值

這是我正在嘗試做的。我有一張桌子,我正在記錄GPS位置。每行都有一個pointId,routeId,緯度,經度和日期時間。

我的結果集中的每一行都需要包含每個routeId的第一個和最後一個記錄的日期時間,這是我現在得到的,但我還需要包括第一個和最後一個記錄的經度和緯度。

這裏就是我有這麼遠,除去幾個版本,聯接和子查詢後沒有工作:http://www.sqlfiddle.com/#!7/47012/69(注意值不實)

我想什麼去是:

routeid minDatetime   maxDatetime   firstLat firstLong lastLat lastLong 
54  2014-02-16 12:01:00 2014-02-16 12:06:00 0.0004 1.345  0.0007 1.349 
55  2014-02-16 12:07:00 2014-02-16 12:07:00 0.0011 1.388  0.0011 1.388 

我希望這是有道理的。任何幫助讚賞。

回答

1

你可以採取的ORDER BY優勢,LIMIT

SELECT * FROM <yourtable> WHERE routeid = '54' ORDER BY dateTime DESC LIMIT 1 

拿到第一個;

SELECT * FROM <yourtable> WHERE routeid = '54' ORDER BY dateTime ASC LIMIT 1 

得到最後一個。

邏輯。選擇id與您感興趣的行相匹配的行,按dateTime排序,無論是降序還是升序,並返回第一個。

+0

我最想做的是在一個查詢中獲取所有記錄的數據,而不是多次返回數據庫。我快到了 - 只有當有多個routeId時,無法確定沒有連接的第一行和最後一行值,並排除所有記錄。我無法找出子查詢,因爲我無法與routeId建立關係。 –

1

我設法拿出一個工作查詢,其從反對我有限的測試記錄運行,並返回我後雖然直到我進入我的應用程序這個我不是100%肯定它是正確的我。

http://www.sqlfiddle.com/#!7/47012/147

我的查詢,這無疑可以改進:

select 
a.routeId, 
min(a.datetime), 
max(a.datetime), 
(select latitude from GPSPointLog b 
    WHERE b.routeId = a.routeId ORDER BY datetime LIMIT 1) 'firstLat', 
(select longitude from GPSPointLog c 
    WHERE c.routeId = a.routeId ORDER BY datetime LIMIT 1) 'firstLong', 
(select latitude from GPSPointLog d 
    WHERE d.routeId = a.routeId ORDER BY datetime DESC LIMIT 1) 'lastLat', 
(select longitude from GPSPointLog e 
    WHERE e.routeId = a.routeId ORDER BY datetime DESC LIMIT 1) 'lastLong' 
from GPSPointLog a 
GROUP BY a.routeId 
order by a.routeId 

,我知道我錯了下去JOIN的路線。

相關問題