SQL查询中获取当前行列值及计算审计报告到期日方法
解决审计报告NextDueDate计算的SQL优化方案
针对你需要根据FormF记录数量计算企业审计下一次到期日的需求,我先指出原SQL中的几个关键问题,再提供优化后的代码:
原SQL存在的问题
- 子查询中
F.[EntityID] = F.[EntityID]是无意义的自相等,无法正确统计对应企业的记录数,会误统计全表数据 - 重复使用子查询获取最新ReportingTo,性能较低
DATEADD(year, 1, ...) + 1的写法不够清晰,容易混淆是加1天还是其他逻辑- WHERE子句中的
F.[EntityID] = F.[EntityID]完全多余,可直接移除
优化后的SQL代码
SELECT F.[ID], enty.[Title (Title)], FORMAT(F.[ReportingFrom], 'MM/dd/yyyy') AS 'ReportingFrom', FORMAT(F.[ReportingTo], 'MM/dd/yyyy') AS 'ReportingTo', FORMAT(enty.[RegistrationDate], 'MM/dd/yyyy') AS 'RegistrationDate', -- 计算下一次到期日 CASE WHEN EntityRecordCount > 1 THEN FORMAT(DATEADD(year, 1, LatestReportingTo), 'MM/dd/yyyy') ELSE FORMAT(DATEADD(year, 1, enty.[RegistrationDate]), 'MM/dd/yyyy') END AS 'AuditDueDate', F.[EntityID] FROM ( SELECT *, -- 统计每个企业的FormF记录总数 COUNT(*) OVER (PARTITION BY EntityID) AS EntityRecordCount, -- 获取每个企业最新的ReportingTo日期(按ID倒序取最新,或用MAX(ReportingTo)更直接) MAX(ReportingTo) OVER (PARTITION BY EntityID) AS LatestReportingTo FROM [db_owner].[FormF] ) F JOIN [db_owner].entity enty ON F.[EntityID] = enty.ID
逻辑说明
- 用窗口函数提前计算每个企业的记录数和最新ReportingTo日期,避免重复子查询,提升查询效率
- 严格匹配你的需求:
- 若企业存在多条FormF记录,取最新表单的
ReportingTo日期加1年作为到期日 - 若仅1条记录,取
RegistrationDate加1年作为到期日
- 若企业存在多条FormF记录,取最新表单的
- 如果你的需求是到期日为加1年后的次日,只需把
DATEADD(year, 1, ...)改为DATEADD(day, 1, DATEADD(year, 1, ...))即可
内容的提问来源于stack exchange,提问作者ShahidAliK
相关产品推荐
相关产品推荐

