如何用SQL按提供者编号筛选每人最近11条提交数据?
按提供者获取最近11条记录的SQL实现
你的原有SQL存在两个核心问题:
- 子查询
(Select MAX(MonthName) from incentive.F_IndividualMonthSummary)是全局查询所有记录的最大月份,不是当前提供者的最新月份 DISTINCT会自动去重,导致只能得到唯一的提供者-季度-月份组合,根本无法保留多条历史记录
要实现每个提供者取最近11条记录,用窗口函数是最直接的方案,具体代码如下:
WITH RankedRecords AS ( SELECT ProviderNumber AS 'Provider Number', Qtr AS 'Report QTR', MonthName AS 'Month', -- 按提供者分组,按季度、月份从新到旧排序,给每条记录标序号 ROW_NUMBER() OVER ( PARTITION BY ProviderNumber ORDER BY Qtr DESC, -- 如果MonthName是英文月份名,转成数字保证排序正确,比如MySQL用下面的写法 MONTH(STR_TO_DATE(MonthName, '%M')) DESC -- SQL Server可替换为:DATEPART(month, CONVERT(datetime, MonthName + ' 01 2000')) DESC ) AS RecordRank FROM incentive.F_IndividualMonthSummary ) SELECT `Provider Number`, `Report QTR`, `Month` FROM RankedRecords WHERE RecordRank <= 11;
关键逻辑说明:
PARTITION BY ProviderNumber:按提供者编号拆分数据集,确保每个提供者的记录单独排序ORDER BY Qtr DESC, ...:按季度从新到旧排序,同季度内按月份从新到旧排序(必须保证月份排序逻辑正确,文本月份名要转成数字)ROW_NUMBER():给每个提供者的记录按时间倒序标序号,最新的记录序号为1,以此类推- 最后筛选序号≤11的记录,就是每个提供者的最近11条提交记录
如果你的数据库不支持CTE(WITH语句),可以改用子查询写法:
SELECT `Provider Number`, `Report QTR`, `Month` FROM ( SELECT ProviderNumber AS 'Provider Number', Qtr AS 'Report QTR', MonthName AS 'Month', ROW_NUMBER() OVER ( PARTITION BY ProviderNumber ORDER BY Qtr DESC, MONTH(STR_TO_DATE(MonthName, '%M')) DESC ) AS RecordRank FROM incentive.F_IndividualMonthSummary ) AS RankedRecords WHERE RecordRank <= 11;
内容的提问来源于stack exchange,提问作者VanilaNitroPepsi
相关产品推荐
相关产品推荐

