我有一张包含gps数据的表格:
lat, lon, timestamp
我的查询按时间戳窗口选择:
SELECT * FROM gps WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z'
对于较大的timepans,结果集变得很大,我想限制结果集的大小。但是,我仍然希望数据覆盖整个时间跨度,但分辨率会降低。而不是
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 >= ...
答案 0 :(得分:6)
使用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
答案 1 :(得分: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个值。