Выбрать из таблицы, удалив похожие строки - PostgreSQL

Есть таблица с ревизиями документов и авторами. Выглядит так:

doc_id rev_id rev_date заголовок редактора, содержание и так далее....
123 1 2016-01-01 03:20 Билл......
123 2 2016-01-01 03:40 Билл
123        3       2016-01-01 03:50 Билл
123 4 2016-01-01 04:10 Билл
123        5       2016-01-01 08:40 Алиса
123        6       2016-01-01 08:41 Алиса
123        7       2016-01-01 09:00 Билл
123        8       2016-01-01 10:40 Кейт
942        9-01-01-01 11:10 Алиса
942       10-01-01-01 11:15 Билл
942       15-01-01-01 11:17 Билл
  

Мне нужно выяснить моменты, когда документ был перенесен в другой редактор - только первые строки каждой серии изданий.

Вот так:

doc_id rev_id rev_date заголовок редактора, содержание и так далее....
123 1 2016-01-01 03:20 Билл......
123        5       2016-01-01 08:40 Алиса
123        7       2016-01-01 09:00 Билл
123        8       2016-01-01 10:40 Кейт
942        9-01-01-01 11:10 Алиса
942       10-01-01-01 11:15 Билл
  

Если я использую DISTINCT ON (doc_id, editor), он восстанавливает таблицу, и я вижу только одну на документ и редактор, что неверно. Конечно, я могу сбросить все и отфильтровать с помощью инструментов оболочки, таких как awk | сортировать | уник. Но это не хорошо для больших столов.

Оконные функции, такие как FIRST_ROW, не дают много, потому что я не могу разделить по doc_id, редактор, чтобы не испортить их все.

Как сделать лучше?

Спасибо.

1 ответ

Решение

Ты можешь использовать lag() чтобы получить предыдущее значение, а затем простое сравнение:

select t.*
from (select t.*,
             lag(editor) over (partition by doc_id order by rev_date) as prev_editor
      from t
     ) t
where prev_editor is null or prev_editor <> editor;
Другие вопросы по тегам