2012-03-14 41 views
0

我有一張每週在週一加載員工記錄的表。加載日期存儲在記錄中。我需要將總變化(添加/更新)記錄從一週到下一個總和。SQL比較同一表中的記錄版本

這是我到目前爲止。它將最新載入日期的新記錄和更新記錄計數與前一載入日期進行比較。

我不確定這是否是一個很好的方法來做到這一點,我真的很感激任何反饋,我可以得到關於我的方法,或建議更好的方式來實現我的目標。

感謝。

SELECT  
    RIGHT(CONVERT(VARCHAR(10), REPORT_DATE, 103), 7) AS REPORT_DATE, 
    [NEW], 
    [UPDATED] 
FROM 
(
SELECT 
     CUR.LOAD_DATE AS REPORT_DATE, 
     CASE 
      WHEN PRV.LOAD_DATE IS NULL THEN 'NEW' 
      ELSE 'UPDATED' 
     END AS RECORD_TYPE, 
     COUNT(*) AS RECORD_COUNT 
FROM 
     (SELECT * 
     FROM EMPLOYEES 
     WHERE LOAD_DATE = (SELECT MAX(LOAD_DATE) FROM EMPLOYEES)) CUR 
    LEFT OUTER JOIN 
      (SELECT * 
      FROM EMPLOYEES 
      WHERE LOAD_DATE = (SELECT DATEADD(WEEK,-1,MAX(LOAD_DATE)) FROM EMPLOYEES))PRV 
      ON 
      CUR.EMPLOYEE_ID = PRV.EMPLOYEE_ID 
WHERE 
     PRV.EMPLOYEE_ID IS NULL 
     OR (CUR.FIRST_NAME != PRV.FIRST_NAME 
     OR CUR.LAST_NAME != PRV.LAST_NAME 
     OR CUR.ADDRESS1 != PRV.ADDRESS1 
     OR CUR.ADDRESS2 != PRV.ADDRESS2 
     OR CUR.CITY != PRV.CITY 
     OR CUR.STATE != PRV.STATE 
     OR CUR.ZIP != PRV.ZIP 
     OR CUR.POSITION != PRV.POSITION 
     OR CUR.LOCATION != PRV.LOCATION) 
GROUP BY 
     CUR.LOAD_DATE, 
     PRV.LOAD_DATE 
) DT 
PIVOT 
(SUM(RECORD_COUNT) FOR RECORD_TYPE IN ([NEW], [UPDATED])) PV; 

回答

1

我有幾個建議,可以簡化您的代碼,甚至提高了查詢的性能。

  1. 當你在尋找「最後加載數據的日期爲員工」,嘗試添加表記錄的加載過程,其中包含加載時間。這樣可以提高性能,而且不必使用「從...中選擇MAX(LOAD_DATE)」兩次。
  2. 您可以添加一個附加列來記錄記錄的更新時間;所以當你正在尋找改變的記錄時,只是爲了比較記錄的「更新時間」和「加載時間」。在此表上添加更新觸發器將是修改「更新時間」的更好策略。

基於上述建議,重點是防止兩次加入表格並觸摸數據頁面。由於您的報告要檢索數據的「SUM」,因此您不必使用「EMPLOYEES」表的全部信息。

首先,代碼更清晰,以符合您對「總變更記錄總和」的意圖。其次,數據庫只需要索引來「計算」您的數據度量(當然,這是「load_date」的適當索引),因此性能應該優於您的「JOIN-SELF-TABLE」方法。

有多種方式可以通過SQL生成報告。由於SQL是一種難以閱讀的語言,因此簡潔的書寫是一個維護問題。因爲要找出SQL中的性能問題非常困難,所以編寫更高效的SQL比之後重寫更有價值。

在我的經驗中, 「體面的SQL」 講述的是:

  1. 在合理預期可接受的性能。
  2. 不犧牲性能,使代碼更具可讀性。

請原諒我重複我的觀點,如果你有一個複雜的SQL表現不佳。爲了提高後續性能,修改SQL的風險更大。

+0

謝謝Mike的建議。把MAX(Load_Date)的值放在一個變量中並用它代替兩次使用MAX是否合理? – WilliamB2 2012-03-14 04:27:38

+0

這會比你的原始版本更好。在最壞的情況下,請確保「load_date」上有索引。 – 2012-03-14 05:33:35

+0

除此之外,這是一個體面的方法來獲取我需要的信息嗎? – WilliamB2 2012-03-14 10:59:08