2016-12-29 30 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个值。