2010-03-24 85 views
1

我們有一個每天從客戶端導入數據文件的SQL Server。這些數據是相互關聯的,我們一直在對它進行清理,並且在這些文件之間尋找可疑的重複記錄。在SQL Server中,將記錄與其他記錄進行比較以找出給定值範圍內的重複項的最有效方法是什麼?

查找和標記可疑記錄可能會非常複雜。我們使用需要某些字段值相同的邏輯,允許一些字段值不同,並且允許指定一個範圍來指定某些字段值可能有多不同。我們發現這樣做的唯一方法是使用基於光標的進程,這給數據庫帶來了沉重的負擔。

所以我想問問是否有更有效的方法來做到這一點。我聽說它說幾乎總是有一種更高效的方法來用聰明的JOINS替換遊標。但我不得不承認,我在這方面遇到了很多麻煩。

對於一個具體的例子,假設我們有1個表格,一個「訂單」表格,下面6個字段。

(order_id, customer_id, product_id, quantity, sale_date, price) 

我們希望查看記錄以查找以下示例條件中的可疑重複項。這些越來越難。具有相同的product_id,SALE_DATE和數量,但不同的customer_id的

  1. 記錄應標記爲審查犯罪嫌疑人重複
  2. 記錄具有相同CUSTOMER_ID,PRODUCT_ID,數量和具有在彼此五天sale_dates應被標記爲可疑複製品以供審覈
  3. 具有相同customer_id,product_id但在20個 單位內的不同數量以及彼此之間的五天內的銷售日期的記錄應被視爲可疑。

是否有可能通過使用JOINS的單個SQL查詢來滿足這些條件中的每一個?這是做這件事最有效的方法嗎?

回答

0

如果這變得更加複雜,那麼您可能會考慮一個簡單的ETL過程來爲您承擔繁重的工作:數據庫的負載應該可以管理,因爲您將加載到ETL環境,運行轉化/檢查/比較,然後將結果寫入可能是輸出所需統計數據的臨時表。這聽起來像很多工作,但一旦設置,調整它並不是很大的痛苦。另一方面,如果您正在比較大量數據,那麼這可能需要大量的網絡流量。

+0

我們正在尋找可以在服務器上運行的單個SQL語句,只要所有數據都在表中(臨時或其他)存在。 – Glenn 2010-03-25 20:23:18

0

我認爲高效率意味着將索引添加到正在查看內容的字段中。不確定是否需要megajoin,或只是將可疑記錄的主鍵列入保留表中,以便稍後列出問題。即你需要知道爲什麼每個記錄是結果犯罪嫌疑人設置

你可以

- 假設一些PKID(主鍵)已添加 1.

選擇PKID,ORDER_ID,CUSTOMER_ID PRODUCT_ID ,數量,銷售日期 來自訂單o 將訂單o2添加到o.product_id = o2.productid和o.sale_date = o2.sale_date 以及o.quantity = o2.quantity和o。客戶ID <> o2.customerid

然後繼續加入了訂單更多的副本,我想

0

您可以在一個Case語句做到這一點。在以下情況下,MarkedForReview的值將告訴您三個測試(1,2或3)中的哪一個觸發了審查。請注意,我必須在第二次測試之前檢查第三次測試的條件。

With InputData As 
    (
    Select order_id, product_id, sale_date, quantity, customer_id 
     , Case 
      When O.sale_date = O2.sale_date Then 1 
      When Abs(DateDiff(d, O.sale_date, O2.sale_date)) <= 5 
       And Abs(O.quantity - O2.quantity) <= 20 Then 3 
      When Abs(DateDiff(d, O.sale_date, O2.sale_date)) <= 5 Then 2 
      Else 0 
      End As MarkedForReview 
    From Orders As O 
     Left Join Orders As O2 
      On O2.order_id <> O.order_id 
       And O2.customer_id = O.customer_id 
       And O2.product_id = O.product_id 
    ) 
Select order_id, product_id, sale_date, quantity, customer_id 
From InputData 
Where MarkedForReview <> 0 

順便說一句,如果您使用SQL Server 2005之前的某些東西,則可以使用派生表實現等效查詢。另請注意,您可以返回觸發審覈的補充訂單的ID。這兩個觸發審查的訂單顯然都會被退回。

相關問題