26

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

4

3 回答 3

42

如果你使用 PostgreSQL,你可以使用row_number()

SELECT t.*
FROM (
  SELECT *, row_number() OVER(ORDER BY id ASC) AS row
  FROM yourtable
) t
WHERE t.row % 5 = 0
于 2013-10-25T17:24:08.873 回答
1

如果 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
于 2015-11-03T13:31:09.720 回答
-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子句定义
于 2013-10-25T18:34:40.500 回答