SQL根据总数选择每个第x行

时间:2016-12-29 11:14:16

标签: sql postgresql

我有一张包含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 >= ...

2 个答案:

答案 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个值。