• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

SQL比较同一表中的记录版本

sql 来源:WilliamB2 7次浏览

我有一张每周在周一加载员工记录的表。加载日期存储在记录中。我需要将总变化(添加/更新)记录从一周到下一个总和。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. 当你在寻找“最后加载数据的日期为员工”,尝试添加表记录的加载过程,其中包含加载时间。这样可以提高性能,而且不必使用“从…中选择MAX(LOAD_DATE)”两次。
  2. 您可以添加一个附加列来记录记录的更新时间;所以当你正在寻找改变的记录时,只是为了比较记录的“更新时间”和“加载时间”。在此表上添加更新触发器将是修改“更新时间”的更好策略。

基于上述建议,重点是防止两次加入表格并触摸数据页面。由于您的报告要检索数据的“SUM”,因此您不必使用“EMPLOYEES”表的全部信息。

首先,代码更清晰,以符合您对“总变更记录总和”的意图。其次,数据库只需要索引来“计算”您的数据度量(当然,这是“load_date”的适当索引),因此性能应该优于您的“JOIN-SELF-TABLE”方法。

有多种方式可以通过SQL生成报告。由于SQL是一种难以阅读的语言,因此简洁的书写是一个维护问题。因为要找出SQL中的性能问题非常困难,所以编写更高效的SQL比之后重写更有价值。

在我的经验中, “体面的SQL” 讲述的是:

  1. 在合理预期可接受的性能。
  2. 不牺牲性能,使代码更具可读性。

请原谅我重复我的观点,如果你有一个复杂的SQL表现不佳。为了提高后续性能,修改SQL的风险更大。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)