从表中选择删除类似的行 - PostgreSQL

时间:2016-01-31 14:35:37

标签: postgresql window distinct aggregate-functions

有一个包含文档修订和作者的表格。看起来像这样:

doc_id    rev_id   rev_date            editor    title,content so on....
123        1       2016-01-01 03:20    Bill        ......
123        2       2016-01-01 03:40    Bill
123        3       2016-01-01 03:50    Bill
123        4       2016-01-01 04:10    Bill
123        5       2016-01-01 08:40    Alice
123        6       2016-01-01 08:41    Alice
123        7       2016-01-01 09:00    Bill
123        8       2016-01-01 10:40    Cate
942        9       2016-01-01 11:10    Alice
942       10       2016-01-01 11:15    Bill
942       15       2016-01-01 11:17    Bill
  

我需要找出将文档转移到另一个编辑器的时刻 - 每个版本系列的第一行。

像这样:

doc_id    rev_id   rev_date            editor    title,content so on....
123        1       2016-01-01 03:20    Bill        ......
123        5       2016-01-01 08:40    Alice
123        7       2016-01-01 09:00    Bill
123        8       2016-01-01 10:40    Cate
942        9       2016-01-01 11:10    Alice
942       10       2016-01-01 11:15    Bill
  

如果我使用DISTINCT ON(doc_id,编辑器),它会对一个表进行解析,我只看到每个文档和编辑器一个,这是不正确的。 当然我可以转储所有并使用像awk |这样的shell工具进行过滤排序| uniq的。但这对大桌子来说并不好。

像FIRST_ROW这样的窗口函数没有给出太多,因为我无法通过doc_id进行分区,编辑器不会弄乱它们。

如何做得更好?

谢谢。

1 个答案:

答案 0 :(得分: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;