有一个包含文档修订和作者的表格。看起来像这样:
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进行分区,编辑器不会弄乱它们。
如何做得更好?
谢谢。
答案 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;