1

テーブル "people" のデータが与えられた場合:

+----+-------+
| 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

1

これまでのところ、精度が必要な状況で見つけた最も簡単なアプローチは、たとえば、ID の値が異なる複数の呼び出しで結果が欠落したり重複したりしないようにすることで、次のようにウィンドウ関数と CTE を組み合わせることです。

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 に答える