SQL比较同一表中的记录版本
我有一张每周在周一加载员工记录的表。加载日期存储在记录中。我需要将总变化(添加/更新)记录从一周到下一个总和。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;
回答:
我有几个建议,可以简化您的代码,甚至提高了查询的性能。
- 当你在寻找“最后加载数据的日期为员工”,尝试添加表记录的加载过程,其中包含加载时间。这样可以提高性能,而且不必使用“从...中选择MAX(LOAD_DATE)”两次。
- 您可以添加一个附加列来记录记录的更新时间;所以当你正在寻找改变的记录时,只是为了比较记录的“更新时间”和“加载时间”。在此表上添加更新触发器将是修改“更新时间”的更好策略。
基于上述建议,重点是防止两次加入表格并触摸数据页面。由于您的报告要检索数据的“SUM”,因此您不必使用“EMPLOYEES”表的全部信息。
首先,代码更清晰,以符合您对“总变更记录总和”的意图。其次,数据库只需要索引来“计算”您的数据度量(当然,这是“load_date”的适当索引),因此性能应该优于您的“JOIN-SELF-TABLE”方法。
有多种方式可以通过SQL生成报告。由于SQL是一种难以阅读的语言,因此简洁的书写是一个维护问题。因为要找出SQL中的性能问题非常困难,所以编写更高效的SQL比之后重写更有价值。
在我的经验中, “体面的SQL” 讲述的是:
- 在合理预期可接受的性能。
- 不牺牲性能,使代码更具可读性。
请原谅我重复我的观点,如果你有一个复杂的SQL表现不佳。为了提高后续性能,修改SQL的风险更大。
以上是 SQL比较同一表中的记录版本 的全部内容, 来源链接: utcz.com/qa/260686.html