Sql 是否可以回放插入/删除表以获取当前状态?

Sql 是否可以回放插入/删除表以获取当前状态?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个表,该表将设备存储为更改历史记录,例如: 示例表PartHistory(还包括数字主键): 每组包括一个或多个I-插入(新设备)D-删除(设备移除)。可以假设有效数据(不移除不存在的设备等) 是否可以使用标准SQL(而不是PL/SQL)来查询这些数据,以便我可以获得特定日期或设置的设备状态 例如: SELECT data, set, date FROM (...ninja SQL...) WHERE ChangeDate = DATE '2014-07-03' partA 2

我有一个表,该表将设备存储为更改历史记录,例如:

示例表PartHistory(还包括数字主键):

每组包括一个或多个I-插入(新设备)D-删除(设备移除)。可以假设有效数据(不移除不存在的设备等)

是否可以使用标准SQL(而不是PL/SQL)来查询这些数据,以便我可以获得特定日期或设置的设备状态

例如:

SELECT data, set, date FROM (...ninja SQL...) WHERE ChangeDate = DATE '2014-07-03'

partA   2   2014-07-03
partB   2   2014-07-03


SELECT data, set, date FROM (...ninja SQL...) WHERE set = 4

partB   4   2014-07-20
partC   4   2014-07-20
partQ   4   2014-07-20

如果您想要“截至”某个特定日期的部分和最新计数,可以使用此结构在SQL中执行此操作。基本上,将“I”值的数量相加,然后减去“D”值的数量,得到计数

select data, sum(case when hst = 'I' then 1 when hst = 'D' then -1 else 0 end) as num
from parthistory ph
where ChangeDate <= DATE '2014-07-03'
group by data
having sum(case when hst = 'I' then 1 when hst = 'D' then -1 else 0 end) > 0;
选择data,sum(当hst='I'时为大小写,当hst='D'时为1,然后为-1,否则为0结束)作为num
来自零件历史
其中ChangeDate为0;

第二列在第一组结果中代表什么?Hst-插入/删除-在第一段代码下面。@Gordon:第二列结果是“set”列。我对SQL进行了编辑,使其更加清晰。A和B的“set”列在行上是“1”。它是如何神奇地变成2的?@GordonLinoff:如果插入或删除,每个设定值代表一个组,因此在第4行,设定值变为2,这是一组不同于第1-3行的变化,第1-3行是a、B和C+1的插入:快速、漂亮,我甚至可以使用它来测试当前设备数据的有效性(存储在单独的表中).
select data, sum(case when hst = 'I' then 1 when hst = 'D' then -1 else 0 end) as num
from parthistory ph
where ChangeDate <= DATE '2014-07-03'
group by data
having sum(case when hst = 'I' then 1 when hst = 'D' then -1 else 0 end) > 0;