web-dev-qa-db-ja.com

次と前の行を選択

次の表があります。

CREATE TABLE post (
  id            bigint primary key,
  thread_id     bigint,
  is_notice     boolean,
  title         text,
  content       text
)

次のクエリを使用してリストを表示します。

SELECT * FROM post ORDER BY is_notice desc, thread_id desc, id

次に、id(i.e。SELECT * FROM post where id=3)、次の投稿と前の投稿を取得するにはどうすればよいですか?

10
alice

PostgreSQLの Window Functions 、具体的にはLAGおよびLEADを使用すると、テーブルの前後のエントリを表示できます。

select *
from (
    select  id, thread_id, is_notice, title, content,
            lag(id) over (order by is_notice desc, thread_id desc, id asc) as prev,
            lead(id) over (order by is_notice desc, thread_id desc, id asc) as next
    from post
    ) x
where 3 IN (id, prev, next);

デモはここにあります: http://sqlfiddle.com/#!15/9fd7a/8

14
bma