考虑以下数据:
history.data
=======================================
id |data_id| col1 | col2 | date
---+-------+-------+-------+-----------
1 |1 | 123 | 321 | 2017-08-01
2 |1 | 124 | 321 | 2017-08-03
3 |2 | 222 | 555 | 2017-08-05
4 |2 | 242 | 555 | 2017-08-07
5 |2 | 242 | 333 | 2017-08-11
这就是 history_data
表,我将所有更改保存在某个表中。
现在,我需要获取 col1
列中每个当前 data
条目的最后更改日期。
在这种情况下,所需的输出应该是
data_id | date
--------+-----------
1 | 2017-08-03
2 | 2017-08-07
我需要在以下上下文中执行此操作:
with cte1 as (
select distinct on(data_id)
data_id,
date::date
from data d
join history.data hd on hd.data_id = d.id
order by d.id, hd.date desc
)
正如您所看到的,现在我只是获取最后一次记录更改的日期,无论更改发生在哪一列上。
有人可以帮我吗?
最佳答案
您可以使用lag()
获取上一个 prev_col1
值和prev_col1 <> col1
识别发生更改的所有行:
select distinct on(data_id) * from (
select lag(col1) over (partition by data_id order by d.id) prev_col1,
d.id,
col1,
data_id,
date::date
from data d
join history.data hd on hd.data_id = d.id
) t where prev_col1 <> col1 or prev_col1 is null
order by id desc
prev_col1 is null
每个 data_id
仅包含 1 名成员的团体需要满足条件并假设第一个成员符合变更资格。
关于sql - 检测历史表中特定列的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45687616/