Выбрать из таблицы, удалив похожие строки - 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;