确定与先前记录的差异(按日期)

时间:2016-05-30 21:04:21

标签: sql firebird window-functions

我正在沿着缓慢变化的维度实施一种历史轨迹。图案。

我有一个看起来像这样的表:

create table ITEMS
(
  UID integer not null,
  REF varchar(20),
  TITLE varchar(100),
  DESCRIPTION varchar(1000),
  AUTHOR integer,
  ITEM_ID integer,
  VALID_FROM timestamp,
  VALID_TO timestamp,
  constraint PK_ITEMS_0 primary key (UID)
);

我有两个触发器,一个填充UID字段的前插入(代理键)并有条件地设置ITEM_ID(自然键)和时间戳字段。

更新前触发器会创建一个新记录(从而运行插入前触发器)并将现有值复制到该记录。如果用户更改了某些内容,实际插入将覆盖现有值。

我还没有在这里包含触发器以保持问题简短,但如果它更好可以做到吗?

包含最新版本的记录'将VALID_TO时间戳设置为NULL。

我可以使用如下查询获取给定项目的历史记录:

select REF, TITLE, DESCRIPTION, ITEM_ID, VALID_FROM, VALID_TO
 from ITEMS
 where ITEM_ID = 21
 order by VALID_FROM desc

这非常有效,但我想扩展此查询,以便查看哪些字段已更改。在这个例子中,只有REF,TITLE和DESCRIPTION可以改变,但更通用的查询会很好。

我认为这可以使用LAG完成,例如如下所示:

select REF, TITLE, DESCRIPTION, ITEM_ID, VALID_FROM, VALID_TO,
  iif (DESCRIPTION is distinct from lag(DESCRIPTION) 
    over (order by VALID_FROM asc), 
    'Desc Changed', '') 
from ITEMS 
where ITEM_ID = 1
order by VALID_FROM desc

但欢迎任何更好的想法。理想情况下,我希望有一个查询来执行此操作,但如果存储过程更好,那么也没关系。

我目前正在使用Firebird 2.5.5,但如果需要可以升级到3.0.0。

0 个答案:

没有答案