2014-02-07 98 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。 。 。有很多使用窗口函數的技巧。他們非常強大。 –