这与我先前询问的滞后/线索为suggested的问题有关。然而,我正在使用的数据比我最初想的更复杂,所以我需要一个更强大的解决方案。此屏幕截图显示了我需要解决的问题:
在单个序列号中,货件事件定义新的参考窗口。因此记录2,3,4涉及1.记录6涉及5等等。我需要标记BillToId与父货物不匹配的记录。
我正在尝试了解我是否甚至可以使用LAG功能将记录2,3,4比较,当装运后事件的数量变化时(允许重复)。我想我可能会更好地使用另一个事实表来识别每个记录中的父rowid吗?
那么我的问题就是如何有效识别每一行所属的货物?我是否被迫为每条记录运行一个子查询?我现在正在工作,总行数超过200万。我稍后会将此查询作为ETL过程的一部分,因此它将处理较小的数据块。
答案 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;