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

SQL如何提取前一行Ending Balance作为Starting Balance并筛选Count行

实现方案

这个需求可以直接用SQL标准窗口函数LAG()实现,核心逻辑是按ITEM ID分组(适配多商品场景)、按LINE升序排序后,取上一行的ENDING BALANCE作为当前行的Starting Balance,最后过滤REASON = 'Count'的行即可,适配MySQL 8.0+/PostgreSQL/SQL Server/Oracle等所有支持窗口函数的主流数据库。


参考SQL代码

SELECT 
    `ITEM ID`,
    `ITEM`,
    `LAST UPDATED`,
    `REASON`,
    LAG(`ENDING BALANCE`, 1) OVER (
        PARTITION BY `ITEM ID` 
        ORDER BY `LINE` ASC
    ) AS `Starting Balance`,
    `ENDING BALANCE`
FROM 你的实际表名
HAVING `REASON` = 'Count'

逻辑说明

  • LAG(列名, 偏移量) 是SQL标准窗口函数,作用是取当前行往前数第N行的指定列值,偏移量填1就是取紧邻上一行的数值
  • PARTITION BY ITEM ID`` 是按商品ID分组,避免不同商品的余额数据串计算,如果你的表只有单一商品可以去掉这个分区条件
  • 如果业务要求首行没有上一行记录时,Starting Balance默认显示0,可以把LAG部分改成COALESCE(LAG(ENDING BALANCE, 1) OVER (PARTITION BY ITEM IDORDER BYLINE ASC), 0)

低版本数据库兼容方案

如果你用的是不支持窗口函数的低版本MySQL,也可以用自关联实现:

SELECT 
    t1.`ITEM ID`,
    t1.`ITEM`,
    t1.`LAST UPDATED`,
    t1.`REASON`,
    t2.`ENDING BALANCE` AS `Starting Balance`,
    t1.`ENDING BALANCE`
FROM 你的实际表名 t1
LEFT JOIN 你的实际表名 t2 
    ON t1.`ITEM ID` = t2.`ITEM ID` 
    AND t1.`LINE` = t2.`LINE` + 1
WHERE t1.`REASON` = 'Count'

拿你提供的样本数据测试两种方案,都能得到你给出的预期输出结果。

内容的提问来源于stack exchange,提问作者Mystical Me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:06:04