跳过PostgreSQL中的每个第n个结果行

时间:2013-10-25 17:15:49

标签: sql postgresql

我正在寻找一种在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行的最快方法是什么?

3 个答案:

答案 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子句
  • 定义