如何获得正确的累积余额?
Posted
技术标签:
【中文标题】如何获得正确的累积余额?【英文标题】:How to get correct cumulative balance? 【发布时间】:2021-01-30 20:33:17 【问题描述】:我有这个简单的查询
select ArticleID, Prix, Qte, InfStock
, SUM(Qte*InfStock) OVER (Partition BY ArticleID ORDER BY DateDocument) AS CUMUL
FROM Balance
请看结果(第 4 行) Here is the backup file(zipped)
【问题讨论】:
请不要使用图像作为数据,使用格式化文本。如果您以 DDL+DML 的形式发布示例数据,人们可以更轻松地为您提供帮助。 不,在我看来,是不是bug,我只有Sql express 2014 SP1,数据库文件是否损坏?,整个结果大约是501K行。 您需要向我们展示 InfStock 和 DateDocument 以便我们了解问题所在。可能您与日期列有联系,在这种情况下您需要知道默认值是 RANGE 而不是 ROWS 要解决问题,请在选择列表中包含DateDocument
,并在查询末尾添加ORDER BY ArticleID, DataeDocument
。
@saimmm0710 我们不想要你的备份文件,我们想要一个强调minimal的minimal reproducible example。此外,我认为您提供的答案和 cmets 足以解决问题。
【参考方案1】:
您需要在OVER
子句的末尾添加ROWS UNBOUNDED PRECEDING
。
SUM
默认为 RANGE UNBOUNDED PRECEDING
,这可能会导致此类问题。
例如,请参阅here 以获得进一步的解释。
【讨论】:
和/或向ORDER BY
添加一个决胜局,因此它始终是唯一的/确定的
非确定性是一个单独的问题。每次可能返回不同的结果,但每个结果基本上都是正确的。如果没有ROWS
,结果就是错误的EDIT是的,你可以通过确定性来解决这个问题,但这实际上只是一个hack。
这不是一个单独的问题 - 当ORDER BY
子句中有联系时,RANGE
和 ROWS
之间的结果差异就会发挥作用。因此,如果无法建立联系,它们的行为将相同(结果明智)。在某些情况下,指定 ROWS
仍然有性能优势(在 2014 年,使用 ROWS
总是会有更好的性能)
还需要“您还需要按DateDocument排序查询,以确保运行余额与列出的记录顺序相同。”对吗?
@saimmm0710 AND CURRENT ROW
无论如何都是默认的,所以你可以写ROWS UNBOUNDED PRECEDING
以上是关于如何获得正确的累积余额?的主要内容,如果未能解决你的问题,请参考以下文章
如何获得USDT余额BEP-20? web3.eth.getBalance