mysql SQL:查找列之间的差异,直到12行,然后将差异相加

aiqt4smr  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(137)

我正在寻找SQL来查找列之间的差异,只有到12行,然后求和的差异。例如,这是我的TAB_PAYOUT表。列DIFFERENCE的计算方法是用下一行减去列PAY的值。我的要求是找到第13行的差异,并将差异相加。此表可以有12个以上的行。
这是到目前为止,我已经尝试过,但不知道如何停止计算的差异,在第12行的表

SELECT ID, 
       SUM(Difference) 
FROM ( SELECT ID,
              PAY AS PAY,
              LAG(PAY,1,0) OVER (ORDER BY ID) previous_row,
              LEAD(PAY,1,0) OVER (ORDER BY ID) next_row,
              LAG(PAY, 1, 0) OVER (ORDER BY ID) - PAY AS Difference
       FROM TAB_PAYOUT 
       where ID = '000000003502'
       order by 1 asc
       )
GROUP BY ID

sg2wtvxw

sg2wtvxw1#

SELECT ID,SUM(DIFFERENCE) AS Total_Difference
FROM (
SELECT ID
,PAY AS PAY
,(PAY - LEAD(PAY) OVER (ORDER BY ID)) AS DIFFERENCE
FROM TAB_PAYOUT
WHERE ID = '000000003502'
) subquery
WHERE ROWNUM <= 12

如果只需要12行,可以使用ROWNUMLIMIT

sdnqo3pr

sdnqo3pr2#

几件事
order by 1 asc实际上什么都不做。它们都具有相同的排序值,因此顺序不可预测。它可能会在某种顺序插入,但不能保证。要使此操作有意义,您可能需要使用标识列或日期列进行排序。
此外,差异之和与组中第一个和最后一个之间的差异没有什么不同。如果你想看到12个条目之间的差异之和,你可以使用LAG返回12,而不是返回1。

SELECT ID,
              PAY AS PAY,
              LAG(PAY, 12, 0) OVER (ORDER BY ID) - PAY AS Difference
       FROM TAB_PAYOUT 
       where ID = '000000003502'

如果你只想要12行,那么我猜你可以只添加LIMIT 12.在SQL中可能不会尝试。
最后,你在末尾有一个GROUP BY ID,但只有一个ID。如果您想扩展此功能以同时查询所有ID,则可能需要一个子查询,这可能非常慢。

相关问题