sql - 检测历史表中特定列的变化

标签 sql postgresql postgresql-9.4

考虑以下数据:

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/

相关文章:

php - 选择月份中的日期在 30 到 15 之间的所有记录

sql - 多个内部联接时查询表达式 VBA 中的语法错误(缺少运算符)

postgresql - Postgres gist 排除时间范围,除非 id 是特定值

performance - 如果 Postgres 9 中有额外未使用的列,访问该表是否会变慢?

sql - 从 postgresql DB 中的 jsonb 列检索数据作为数组,返回空结果

sql - 无法在 View 定义 PostgreSQL 中创建临时表

java - 如何在android中检索包含特定单词的联系人姓名?

php - SQL 从多个表中选择 *

sql - 在 Postgres SELECT 语句中选择另一个表中的行数

sql - 检查数据是否具有默认长度并且它在sql中是数字