识别许多事务的父记录

时间:2014-02-07 18:34:47

标签: sql sql-server data-warehouse

这与我先前询问的滞后/线索为suggested的问题有关。然而,我正在使用的数据比我最初想的更复杂,所以我需要一个更强大的解决方案。此屏幕截图显示了我需要解决的问题:

enter image description here

在单个序列号中,货件事件定义新的参考窗口。因此记录2,3,4涉及1.记录6涉及5等等。我需要标记BillToId与父货物不匹配的记录。

我正在尝试了解我是否甚至可以使用LAG功能将记录2,3,4比较,当装运后事件的数量变化时(允许重复)。我想我可能会更好地使用另一个事实表来识别每个记录中的父rowid吗?

那么我的问题就是如何有效识别每一行所属的货物?我是否被迫为每条记录运行一个子查询?我现在正在工作,总行数超过200万。我稍后会将此查询作为ETL过程的一部分,因此它将处理较小的数据块。

1 个答案:

答案 0 :(得分:1)

这是一种在SQL Server中使用累积和功能的方法。这个想法是为每个“船”活动分配一个“1”和“0”的值用于其他一切。然后执行累积求和以标识应具有相同billtoid的每个组。之后,可以将船舶信息分配给同一组中的所有记录:

select rowid, dateid, billtoid, activitytypeid, serialnumber
from (select t.*,
             max(case when activitytypeid = 'Ship' then billtoid end) over
                  (partition by serialnumber, cumships) as ship_billtoid
      from (select t.*,
                   sum(case when activitytypeid = 'Ship' then 1 else 0 end) over
                       (partition by serialnumber order by rowid) as cumships
            from t
           ) t
     ) t
where billtoid <> ship_billtoid;