2016-12-29 75 views
3

選擇每X行我有GPS數據的表:基於SQL的總數

lat, lon, timestamp 

我的查詢選擇通過時間戳窗口:

SELECT * FROM gps WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z' 

ResultSet中變得途徑大較大timespans,我想限制結果集的大小。但是,我仍然希望數據覆蓋整個時間段,但分辨率降低。因此,而不是

LIMIT 1000 

我要選擇基於我指定的最大結果集的大小和數據的實際大小(計數)每第n個元素。

我想是這樣的

limit = 1000 
totalCount = SELECT COUNT(*) FROM gps WHERE timestamp >= ... 
resolution = totalCount/limit 
SELECT every resolution'th FROM SELECT * FROM gps WHERE timestamp >= ... 
+1

您可以使用此窗口功能 –

回答

4

工作與ROW_NUMBER()

SELECT s.* FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(ORDER BY t.timestamp) as rnk, 
      COUNT(*) OVER() as total_cnt 
    FROM gps t 
    WHERE t.timestamp between '2016-12-12T02:00:00Z' AND '2016-12-12T03:00:00Z') s 
WHERE MOD(s.rnk,(total_cnt/1000)) = 0 
+0

感謝您的快速回復。 t沒有定義。所以它應該是SELECT gps。*。我會將它標記爲回答,如果你修復它 – Chris

+0

btw ...我可以只添加限制/選擇計數語句,而不是? – Chris

+0

@Chris固定,忘了別名了。我還添加了「RESOLUTION」的定義,只需將「1000」替換爲所需的限制即可。 – sagi

1

另一種選擇是隨機的數據,然後使用limit

SELECT * 
FROM gp 
WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z' 
ORDER BY random() 
LIMIT x; 

這不保證所有時間戳的準確分佈。但是,它確實可以獲得正好1000個值。