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

如何在SQL中按公司检索最大Fiscal Year及对应最大Fiscal Quarter的行

解决SQL获取每家公司最大财年及对应最大财季记录的问题

嗨,我来帮你搞定这个需求!你已经迈出了第一步,找到每个公司的最大财年记录,接下来只需要再筛选出对应财年里的最大财季就行。这里有几种实用的方法,你可以根据自己的SQL环境选择:

方法1:使用窗口函数(推荐,简洁直观)

窗口函数是现在SQL处理这类分组取TopN场景的首选方案,ROW_NUMBER()可以帮我们给每个公司的记录按财年、财季排序,然后取排名第一的行:

WITH ranked_periods AS (
    SELECT 
        companyId,
        companyname,
        fiscalyear,
        fiscalquarter,
        -- 按公司分组,先按财年降序,再按财季降序排名
        ROW_NUMBER() OVER (PARTITION BY companyId ORDER BY fiscalyear DESC, fiscalquarter DESC) AS rn
    FROM dbo.ciqFinPeriod
)
SELECT companyId, companyname, fiscalyear, fiscalquarter
FROM ranked_periods
WHERE rn = 1;

解释:

  • PARTITION BY companyId:把数据按公司分组
  • ORDER BY fiscalyear DESC, fiscalquarter DESC:每个组内先按财年从大到小排,财年相同的话按财季从大到小排
  • rn = 1:只取每个组里排名第一的记录,也就是每个公司最大财年+最大财季的行

方法2:修改你原来的JOIN方法

你原来的LEFT JOIN思路可以扩展一下,不仅要排除存在更大财年的记录,还要排除财年相同但财季更大的记录:

SELECT fp.companyId, fp.companyname, fp.fiscalyear, fp.fiscalquarter
FROM dbo.ciqFinPeriod fp
LEFT OUTER JOIN dbo.ciqFinPeriod fp2
ON (fp.companyId = fp2.companyId 
    AND (fp.fiscalyear < fp2.fiscalyear 
         OR (fp.fiscalyear = fp2.fiscalyear AND fp.fiscalquarter < fp2.fiscalquarter)))
WHERE fp2.companyId IS NULL;

解释:

  • JOIN条件里新增了(fp.fiscalyear = fp2.fiscalyear AND fp.fiscalquarter < fp2.fiscalquarter),意思是如果两个记录属于同一家公司、同一年,但当前记录的财季更小,也要排除
  • 最后fp2.companyId IS NULL就会留下那些既没有更大财年,也没有同财年更大财季的记录,也就是我们要的目标行

方法3:使用子查询分步筛选

先找出每个公司的最大财年,再基于这个财年找出对应最大财季,最后关联原表获取完整信息:

-- 第一步:找出每个公司的最大财年
WITH max_year AS (
    SELECT companyId, MAX(fiscalyear) AS max_fy
    FROM dbo.ciqFinPeriod
    GROUP BY companyId
),
-- 第二步:找出每个公司最大财年对应的最大财季
max_quarter AS (
    SELECT my.companyId, my.max_fy, MAX(fp.fiscalquarter) AS max_fq
    FROM max_year my
    JOIN dbo.ciqFinPeriod fp ON my.companyId = fp.companyId AND my.max_fy = fp.fiscalyear
    GROUP BY my.companyId, my.max_fy
)
-- 第三步:关联原表获取完整记录
SELECT fp.companyId, fp.companyname, fp.fiscalyear, fp.fiscalquarter
FROM dbo.ciqFinPeriod fp
JOIN max_quarter mq ON fp.companyId = mq.companyId 
    AND fp.fiscalyear = mq.max_fy 
    AND fp.fiscalquarter = mq.max_fq;

解释:

这种方法逻辑清晰,分步拆解需求,适合对窗口函数不太熟悉的场景,每一步都明确筛选出需要的条件,最后关联得到结果。

这三种方法都能得到你期望的结果,比如针对你给出的示例数据,都会返回:

Company ID | Company Name | Fiscal Year | Fiscal Quarter
1 | Test1 | 2018 | 2
2 | Test2 | 2018 | 4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:01:35