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

如何使用SQL获取总和≥指定值的最新数据行?

获取总和达标最新N行数据的SQL实现方案

我来帮你解决这个SQL需求,先从你给出的fb_data表具体案例入手,再扩展到通用的实现方法~


一、针对你提供的具体案例

你的fb_data表包含id、sessions、created_at字段,需要获取最新的若干行,使得它们的sessions总和大于40(示例中返回id=2和3的行,因为24+30=54>40,而单独id=3的24不够)。

实现SQL(支持窗口函数的数据库:MySQL8+、PostgreSQL、SQL Server等)

WITH running_totals AS (
    SELECT
        id,
        sessions,
        created_at,
        -- 按创建时间倒序计算累计会话数,从最新行开始累加
        SUM(sessions) OVER (ORDER BY created_at DESC) AS cumulative_sessions
    FROM fb_data
)
SELECT id, sessions, created_at
FROM running_totals
WHERE cumulative_sessions <= (
    -- 找到第一个超过40的累计值,以此为上限筛选行
    SELECT MIN(cumulative_sessions)
    FROM running_totals
    WHERE cumulative_sessions > 40
);

逻辑说明

  1. 用CTE(公共表达式)running_totals计算每行按created_at倒序的累计sessions值:
    • 最新的行(id=3)累计值是24
    • 次新的行(id=2)累计值是24+30=54
    • 最旧的行(id=1)累计值是54+25=79
  2. 子查询找到最小的超过40的累计值(也就是54),最后筛选所有累计值≤54的行,正好得到id=2和3的目标数据。

二、通用实现方法:获取总和≥指定值的最新N行

这个需求的核心逻辑是:从最新数据开始累加,直到总和达到/超过阈值,返回这些累加的行。下面分两种场景给出通用方案:

场景1:支持窗口函数的现代数据库(推荐)

通用模板,你可以替换对应的表名、字段和阈值:

WITH ranked_data AS (
    SELECT
        your_id_column,       -- 替换为你的主键/唯一标识字段
        your_value_column,    -- 替换为需要累加的字段(比如sessions)
        your_date_column,     -- 替换为排序用的时间字段(比如created_at)
        SUM(your_value_column) OVER (ORDER BY your_date_column DESC) AS cumulative_total
    FROM your_table           -- 替换为你的表名
)
SELECT your_id_column, your_value_column, your_date_column
FROM ranked_data
WHERE cumulative_total <= (
    SELECT MIN(cumulative_total)
    FROM ranked_data
    WHERE cumulative_total >= your_threshold -- 替换为你的阈值(比如40)
);

场景2:不支持窗口函数的老版本数据库(比如MySQL 5.x)

可以用用户变量来模拟累计计算:

SELECT your_id_column, your_value_column, your_date_column
FROM (
    SELECT
        your_id_column,
        your_value_column,
        your_date_column,
        @running_total := @running_total + your_value_column AS cumulative_total
    FROM your_table,
         (SELECT @running_total := 0) AS init_var
    ORDER BY your_date_column DESC
) AS running_totals
WHERE cumulative_total <= (
    SELECT MIN(cumulative_total)
    FROM (
        SELECT
            @rt := @rt + your_value_column AS cumulative_total
        FROM your_table,
             (SELECT @rt := 0) AS init_var
        ORDER BY your_date_column DESC
    ) AS temp
    WHERE cumulative_total >= your_threshold
);

注意事项

  • 如果存在多条相同时间戳的行,建议在ORDER BY中增加额外字段(比如id DESC)来确保排序的稳定性。
  • 如果单行的数值已经超过阈值,只会返回最新的那一行。
  • 如果所有行的总和都达不到阈值,会返回全部数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:27:34