我正在沿着缓慢变化的维度实施一种历史轨迹。图案。
我有一个看起来像这样的表:
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。