如何在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
相关产品推荐
相关产品推荐

