gpt4 book ai didi

sql - 运行总计列的复杂 SQL 查询

转载 作者:行者123 更新时间:2023-12-01 07:09:04 25 4
gpt4 key购买 nike

我正在尝试在 SQL Server 2008 中计算出一个非常复杂的查询。我想在这里提供一些 SQL 专家的意见。

想象一下,我有一个包含以下字段的 Payments 表:

PaymentID int,
客户 ID 整数,
付款日期日期时间,
金额小数

因此,本质上,它是客户在特定日期进行的付款表。需要注意的重要一点是,在某些情况下,付款金额可能是负值。因此,随着时间的推移,任何给定客户支付的总金额可能会上升或下降。

我们试图找出的是计算每位客户支付总额最高点的 SQL。

因此,如果 Fred 支付了 3 笔款项:第一笔支付 5 美元,第二笔支付 5 美元,第三笔支付 - 3 美元。该报告将显示 Fred 的最高总支付金额为 10 美元(在他的第二次付款时),而他的最终支付金额为 7 美元。

我们需要为 10 万个客户(每个客户可能支付了 100 到 1000 笔款项)运行此报告,因此它必须很快。

有没有一种很好的方法来构造这个查询而不将运行总数存储在数据库中?如果可能,我们希望避免存储预先计算的值。

最佳答案

你的问题似乎是这样的:

SELECT CustomerID, SUM(Ammount) FROM table WHERE Amount > 0 GROUP BY CustomerID
SELECT CustomerID, SUM(Ammount) FROM table GROUP BY CustomerID

但是,我认为您的意思是您想要一个看起来像这样的表格
Customer  Payment  HighPoint  RunningTotal
123 5 5 5
123 5 10 10
123 -3 10 7

在这种情况下,我将使用上面的两个选择创建一个 View ,以便该 View 类似于。
SELECT CusotmerID, 
PaymentDate,
Ammount,
(SELECT SUM(Ammount)
FROM table as ALIAS
WHERE ALIAS.Amount > 0
AND ALIAS.PaymentDate <= PaymentDate
AND ALIAS.CustomerID = CustomerID),
(SELECT SUM(Ammount)
FROM table as ALIAS
WHERE ALIAS.CustomerID = CustomerID
AND ALIAS.PaymentDate <= PaymentDate)
FROM table

此外,您可以考虑在表的 Amount 列上使用非唯一索引来加快查看速度。

关于sql - 运行总计列的复杂 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/814054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com