SQL根据总数选择每第X行

SQL根据总数选择每第X行,sql,postgresql,Sql,Postgresql,我有一张包含gps数据的表格: lat, lon, timestamp 我的查询通过时间戳窗口选择: SELECT * FROM gps WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z' 我希望根据指定的最大结果集大小和数据的实际大小(计数)选择每个第n个元素 我想要这样的东西 limit = 1000 totalCount = SELECT COUNT(*) FROM

我有一张包含gps数据的表格:

lat, lon, timestamp
我的查询通过时间戳窗口选择:

SELECT * FROM gps WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z'
我希望根据指定的最大结果集大小和数据的实际大小(计数)选择每个第n个元素

我想要这样的东西

limit = 1000
totalCount = SELECT COUNT(*) FROM gps WHERE timestamp >= ...
resolution = totalCount / limit
SELECT every resolution'th FROM SELECT * FROM gps WHERE timestamp >= ...
使用
行编号()


另一种方法是随机化数据,然后使用
limit

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

其中时间戳>='2016-12-12T02:00:00Z'和时间戳您可以为此使用窗口功能感谢您的快速回复。t没有定义。因此,应该选择gps。*。如果你把它修好了,我会把它标记为已回答。。。我可以只添加limit/select count语句而不是?@Chris Fixed,忘了给它加别名。我还添加了
分辨率的定义
,只需将
1000
替换为所需的限制。
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
SELECT *
FROM gp
WHERE timesamp >= '2016-12-12T02:00:00Z' AND timestamp <= '2016-12-12T03:00:00Z'
ORDER BY random()
LIMIT x;