我正在寻找一种在PostgreSQL中跳过行的方法。
我可以采用以下两种方式:
SELECT * FROM table WHERE id % 5 = 0
但是我必须获取顺序行才能正确跳过。例如,如果我获取行(带有ids)0,3,5, 它不会跳过5行中的4行,而是导致(ids)0和5。
或跳过SQL之外:
$count = 0;
while($row = progres_fetch_row($result))
if ($count++ % 5 == 0)
// do something
从SQL数据库获取每个第n行的最快方法是什么?
答案 0 :(得分:24)
如果您使用PostgreSQL,则可以使用row_number()
:
SELECT t.*
FROM (
SELECT *, row_number() OVER(ORDER BY id ASC) AS row
FROM yourtable
) t
WHERE t.row % 5 = 0
答案 1 :(得分:0)
如果n足够大(如1000),您可以考虑使用WITH RECURSIVE查询,例如:
WITH RECURSIVE foo(name) AS
(SELECT name FROM people ORDER BY name LIMIT 1)
UNION
(SELECT
(SELECT name FROM people
WHERE name >= foo.name
ORDER BY name OFFSET 1500 LIMIT 1)
FROM foo LIMIT 1
)
SELECT * FROM foo
答案 2 :(得分:-1)
如果您无法访问排名功能,例如row_number()
,这是一个通用且可能非常慢的解决方案。所以在MySQL中,你会写:
select *
from x x1
where (
select count(*)
from x x2
where x2.id <= x1.id
) % 5 <> 0
order by x1.id asc
如果要添加其他谓词,请务必将它们添加到外部和内部查询中:
select *
from x x1
where x1.id % 2 = 0
and (
select count(*)
from x x2
where x1.id % 2 = 0
and x2.id <= x1.id
) % 5 <> 0
order by x1.id asc
ORDER BY
子句