2014-02-07 61 views
0

这与我以前询问哪个滞后/潜在客户是suggested的问题有关。然而,我正在使用的数据比我第一次想到的更复杂,所以我需要一个更强大的解决方案。该屏幕截图显示了一个问题,我需要解决:识别许多交易的父记录

enter image description here

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

我试图了解是否我甚至可以使用LAG函数比较记录2,3,4返回1,当发货后事件数量变化时(允许重复)。我想我可能会更好用另一个事实表,首先确定每条记录上的父级rowid?

那么我的问题就变成了如何有效地识别每行属于哪一批货?我是否被迫为每条记录运行子查询?我现在正在处理超过200万行的行。我稍后会将此查询作为ETL过程的一部分,以便处理更小的数据块。

+0

您使用的是哪个版本的SQL Server? –

+0

使用SQL Server 2012 – ElPresidente

回答

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; 
+0

如果我能给你两个upvotes,我会的。谢谢。它甚至没有想到这样做。 – ElPresidente

+0

@ElPresidente。 。 。有很多使用窗口函数的技巧。他们非常强大。 –