1

给定“人”表中的数据:

+----+-------+
| id | name  |
+----+-------+
|  1 | Jane  |
|  2 | Joe   |
|  4 | John  |
|  5 | Alice |
|  6 | Bob   |
+----+-------+

和顺序:

SELECT * FROM people ORDER BY name

...这将返回:

+----+-------+
| id | name  |
+----+-------+
|  5 | Alice |
|  6 | Bob   |
|  1 | Jane  |
|  2 | Joe   |
|  4 | John  |
+----+-------+

如何编写一个查询(包括上面的顺序),它只返回具有给定 id 的行之后的行,例如,如果给定 id 为 1,它将返回:

+----+-------+
| id | name  |
+----+-------+
|  2 | Joe   |
|  4 | John  |
+----+-------+

需要明确的是,id 是可变的,并且事先不知道。

使用通常支持的 SQL 的方法会很棒,但如果 PostgreSQL 9.2 和 ActiveRecord 3.2 有任何其他用途,例如 OVER() 和 ROW_NUMBER(),我将使用它们。

[编辑] 我之前显示了错误的所需结果集,包括具有给定 ID 的行。但是,如问题中所述,结果集应仅包含给定 ID之后的行。

4

2 回答 2

6
select *
from people
where
    name >= (
        select name
        from people
        where id = 1
    )
    and id != 1
order by name
于 2013-04-19T13:01:45.410 回答
1

到目前为止,对于需要精度的情况,我发现的最简单的方法是结合窗口函数和 CTE,例如,在具有不同 ID 值的多个调用中没有丢失或重复结果,如下所示:

WITH ordered_people AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY name) AS n
  FROM people
  ORDER BY name
)

SELECT * 
  FROM ordered_people
  WHERE n > (SELECT n FROM ordered_people WHERE id = 1)
  ORDER BY name
;
于 2013-04-19T17:24:59.357 回答