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

SQL技术问题:如何获取每个AccountId对应的最大生效日期?

问题分析与解决方案

问题原因

你的查询里GROUP BY同时包含了AccountId和RTRIM(codeStatus.Description),这意味着只要同一个AccountId下存在不同的Status描述,哪怕它们的最大生效日期相同,也会被分成不同的组,最终返回多行结果。这就是为什么你会得到两条记录,而非预期的一条。


解决方案

方法一:使用窗口函数(推荐)

通过窗口函数可以精准定位每个AccountId下生效日期最新的记录,代码如下:

WITH RankedPolicies AS (
    SELECT 
        plc.effectivedate,
        plc.AccountId,
        RTRIM(codeStatus.Description) as Status,
        -- 按AccountId分组,生效日期倒序排名,最新记录排第1
        ROW_NUMBER() OVER (PARTITION BY plc.AccountId ORDER BY plc.effectivedate DESC) as rn
    FROM PlcPolicy plc
    JOIN dbo.CodePlcStatus codeStatus WITH (NOLOCK) ON codeStatus.StatusId = plc.StatusId  
    WHERE plc.AccountName LIKE 'Hertz%'
)
SELECT effectivedate as MaxEffectiveDate, AccountId, Status
FROM RankedPolicies
WHERE rn = 1; -- 只保留每个AccountId下的最新记录

如果同一个AccountId下有多个记录共享最大生效日期,且你需要返回所有这类记录,可将ROW_NUMBER()替换为RANK()。

方法二:先取最大日期再关联

先通过子查询获取每个AccountId的最大生效日期,再关联回原表和状态表拿到对应状态:

SELECT 
    plc.effectivedate as MaxEffectiveDate,
    plc.AccountId,
    RTRIM(codeStatus.Description) as Status
FROM PlcPolicy plc
JOIN dbo.CodePlcStatus codeStatus WITH (NOLOCK) ON codeStatus.StatusId = plc.StatusId
-- 关联子查询得到的每个AccountId的最大生效日期
JOIN (
    SELECT AccountId, MAX(effectivedate) as MaxDate
    FROM PlcPolicy
    WHERE AccountName LIKE 'Hertz%'
    GROUP BY AccountId
) maxDates ON plc.AccountId = maxDates.AccountId AND plc.effectivedate = maxDates.MaxDate
WHERE plc.AccountName LIKE 'Hertz%';

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 18:22:11