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 BYITEM ID`` 是按商品ID分组,避免不同商品的余额数据串计算,如果你的表只有单一商品可以去掉这个分区条件- 如果业务要求首行没有上一行记录时,
Starting Balance默认显示0,可以把LAG部分改成COALESCE(LAG(ENDING BALANCE, 1) OVER (PARTITION BYITEM IDORDER BYLINEASC), 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
相关产品推荐
相关产品推荐

