You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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年作为到期日
  • 如果你的需求是到期日为加1年后的次日,只需把DATEADD(year, 1, ...)改为DATEADD(day, 1, DATEADD(year, 1, ...))即可

内容的提问来源于stack exchange,提问作者ShahidAliK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:48:56