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

如何用SQL按提供者编号筛选每人最近11条提交数据?

按提供者获取最近11条记录的SQL实现

你的原有SQL存在两个核心问题:

  1. 子查询(Select MAX(MonthName) from incentive.F_IndividualMonthSummary)是全局查询所有记录的最大月份,不是当前提供者的最新月份
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:05:37