按国家查询月度收入总和最大值及对应创纪录月份技术问询
解决方案:找出每个国家的创纪录收入月份
看来你已经有了基础的月度收入统计SQL,现在需要升级它来定位每个国家收入最高的那个月份对吧?我来帮你调整一下,这里可以用窗口函数ROW_NUMBER()或者RANK()来实现,具体选哪个取决于你想怎么处理并列最高收入的情况(比如一个国家有多个月份收入相同且都是峰值)。
优化后的完整SQL语句
WITH MonthlyCountryRevenue AS ( SELECT d.calendar_year_month AS Record_month, c.country_name AS country, SUM(Net_qty*(unit_charge+unit_shipping_charge)) AS Revenue FROM sensu_reporting.commercial_analysts.customer_science_transactions CST (nolock) JOIN Sensu.dbo.Country_D C (nolock) ON cst.country_code = c.Country_Code JOIN sensu.dbo.Date_D d (nolock) ON cst.Order_Date_Key = d.Date_Key -- 补全你原SQL中未写完的WHERE条件,比如 cst.some_status = 'valid' WHERE cst.si... GROUP BY d.calendar_year_month, c.country_name ), RankedRevenue AS ( SELECT Record_month, country, Revenue, -- 按国家分组,收入降序排名: -- 用RANK()会保留所有并列最高的月份;用ROW_NUMBER()则只取任意一个最高月 RANK() OVER (PARTITION BY country ORDER BY Revenue DESC) AS RevenueRank FROM MonthlyCountryRevenue ) SELECT country, Record_month AS Record_Revenue_Month, Revenue AS Highest_Monthly_Revenue FROM RankedRevenue WHERE RevenueRank = 1;
关键逻辑解释
- 第一个CTE
MonthlyCountryRevenue: 复用你原有的查询逻辑,先按「国家+月份」分组计算每个月的总收入,确保基础统计数据准确。 - 第二个CTE
RankedRevenue: 用窗口函数实现分组排序:PARTITION BY country:确保只在同一个国家内部对月度收入排序ORDER BY Revenue DESC:让收入最高的月份排在最前面,获得排名1- 如果你希望一个国家有多个并列最高收入的月份都被展示,就用
RANK();如果只需要任意取一个最高月,换成ROW_NUMBER()即可。
- 最终查询: 筛选出排名为
1的记录,就是每个国家的创纪录收入月份和对应收入值。
小提示
- 记得把原SQL里未写完的
WHERE cst.si...条件补全到第一个CTE的WHERE子句中,避免遗漏数据过滤规则。 - 使用
(nolock)提示要谨慎:它会读取未提交的事务数据,可能导致脏读,如果对数据准确性要求极高,建议权衡是否保留这个提示。
内容的提问来源于stack exchange,提问作者Oscar Pouw
相关产品推荐
相关产品推荐

