Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL比较同一表中的记录版本_Sql_Sql Server - Fatal编程技术网

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

SQL比较同一表中的记录版本,sql,sql-server,Sql,Sql Server,我有一个表,每周星期一加载员工记录。加载日期存储在记录上。我需要计算从一周到下一周的总更改(添加/更新)记录数 这就是我目前所拥有的。它将最新加载日期的新记录和更新记录计数与前一加载日期进行比较 我不确定这是否是一个好的方法,我真的很感激能得到任何关于我的方法的反馈,或者关于实现我目标的更好方法的建议 谢谢 SELECT RIGHT(CONVERT(VARCHAR(10), REPORT_DATE, 103), 7) AS REPORT_DATE, [NEW],

我有一个表,每周星期一加载员工记录。加载日期存储在记录上。我需要计算从一周到下一周的总更改(添加/更新)记录数

这就是我目前所拥有的。它将最新加载日期的新记录和更新记录计数与前一加载日期进行比较

我不确定这是否是一个好的方法,我真的很感激能得到任何关于我的方法的反馈,或者关于实现我目标的更好方法的建议

谢谢

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;

我有几个建议可以简化您的代码,甚至提高查询的性能

  • 在查找“员工加载数据的最后日期”时,请尝试添加一个表来记录加载过程,其中包含加载时间。这将提高您的性能,并且您不必两次使用“选择最大(加载日期)自…”
  • 您可以添加一个附加列来记录记录的更新时间;所以,当您查找更改的记录时,只需比较记录的“更新时间”和“加载时间”。在这个表上放置一个更新触发器是修改“更新时间”的更好策略
  • 基于上述建议,重点是防止两次加入表和触摸数据页。因为您的报告是检索数据的“总和”,所以您不必使用“EMPLOYEES”表的全部信息

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

    通过SQL生成报表有多种方法。因为SQL是一种很难阅读的语言,所以简洁的编写需要维护。因为要解决SQL中的性能问题是一项艰巨的工作,所以编写一个更高效的SQL比事后重写它更有价值

    根据我的经验,“体面的SQL”是关于:

  • 在似是而非的预期中可接受的表现
  • 在不牺牲性能的情况下,使代码更具可读性

  • 如果您有一个性能很差的复杂SQL,请原谅我重复我的观点。为了以后提高性能而修改SQL的风险更大。

    谢谢你的建议。将MAX(Load_Date)值放在一个变量中并使用它而不是使用MAX两次是否有意义?这将比原始版本更好。在最坏的情况下,确保在“加载日期”上有一个索引。除此之外,这是一个获取我需要的信息的好方法吗?