sql - 每次两个表值的总和,并在 SQL-Server 中找到总和结果的最小值
问题描述
我有两个数据库。在数据库一中,我有一个表(一天数据的 507.000 条记录)
-- insert data from database_1
DROP TABLE IF EXISTS #AccountBalance;
CREATE TABLE #AccountBalance
( AccountNumber VARCHAR(20),AccountBalance MONEY,TranTime DATETIME);
样本数据是 AccountBalance:
BankAccountNumber AccountBalance transactiontime
01003930510 42006.00 2021-03-20
45033323462 4682.00 2021-03-20
23035469562 3388.00 2021-03-20
23005168662 617.00 2021-03-20
01004829050 44640.00 2021-03-20
TransactionCards 的示例数据
BankAccountNumber Balance TransactionTime
45033323462 245428.00 2021-03-21 00:06:47.000
23038201062 140983.00 2021-03-21 00:06:49.000
45019249962 60416.00 2021-03-21 00:07:46.000
45004876662 588154.00 2021-03-21 00:10:46.000
45004876662 627867.00 2021-03-22 00:17:44.000
在数据库二中,我有一个包含 1800 万条记录的表
目标:找到一个值并调用它Minimum Value Of Sum(balance) per record
I trreid : 0. 在一个带有临时表和链接服务器的数据库中插入数据。
- 像下面这样写光标(从 CardTransaction 中获取 BankAccountNumber,如果不存在,则将相同的 BankAccountNumber 插入#Account balance,如果存在则更新余额)
- 计算每次提取(记录或每次)的所有 SUM(AccountBalance) 的总和并将结果插入#Result(游标中的业务清晰)
- 从#Result 中选择 Min(AccountBalance )
-- Create tables for calculate
DROP TABLE IF EXISTS #AccountBalance;
CREATE TABLE #AccountBalance
( BankAccountNumber VARCHAR(20),AccountBalance MONEY,TranTime DATETIME); -- I inserted 507.000 row record data in this table
DROP TABLE IF EXISTS #Result
CREATE TABLE #Result (SumOfBalance MONEY, BankAccountNumber VARCHAR(20), TranTime DATETIME)
-- variable for cursor procces
DECLARE @BankAccountNumber VARCHAR(20);
DECLARE @TransactionBalance MONEY;
DECLARE @TranTime DATETIME;
DECLARE @OldBankAccountNumber VARCHAR(20);
DECLARE @OldAccountBalance MONEY;
DECLARE @OldTranTime DATETIME = '2021-03-20';
-- start cursor
DECLARE CR CURSOR FOR
SELECT rt.BankAccountNumber,rt.Balance,rt.TransactionTime
FROM RawData.dbo.CardTransaction rt;
PRINT '-------Sum of all AccountBalance Report per time------';
OPEN CR;
FETCH NEXT FROM CR
INTO @BankAccountNumber,
@TransactionBalance,
@TranTime;
-- insert sum of account balanace into result table
INSERT INTO #Result (SumOfBalance,BankAccountNumber,TranTime)
SELECT SUM(AccountBalance),@BankAccountNumber,@TranTime FROM #AccountBalance
WHILE @@FETCH_STATUS = 0 AND dbo.DoContinue() = 1
BEGIN
SELECT BankAccountNumber = @OldBankAccountNumber , AccountBalance = @OldAccountBalance FROM dbo.AccountBalance WHERE BankAccountNumber = @BankAccountNumber
IF @OldBankAccountNumber=@BankAccountNumber -- if exists record in account balance
BEGIN
-- update account balance with new balance
UPDATE #AccountBalance
SET AccountBalance = @TransactionBalance
WHERE BankAccountNumber = @BankAccountNumber
-- insert new sum of account balanace into result table
INSERT INTO #Result (SumOfBalance,BankAccountNumber,TranTime)
SELECT SUM(AccountBalance),@BankAccountNumber,@TranTime FROM #AccountBalance
END;
ELSE
BEGIN
--
INSERT INTO #AccountBalance (BankAccountNumber,AccountBalance,TranTime)
VALUES (@BankAccountNumber, @TransactionBalance, @TranTime);
-- insert new sum of account balanace into result table
INSERT INTO #Result (SumOfBalance,BankAccountNumber,TranTime)
SELECT SUM(AccountBalance),@BankAccountNumber,@TranTime FROM #AccountBalance
END;
PRINT @BankAccountNumber
FETCH NEXT FROM CR
INTO @BankAccountNumber,@TransactionBalance,@TranTime;
END;
CLOSE CR;
DEALLOCATE CR;
问题:工作非常缓慢,我等不及要运行光标了。我看不到结果,但我猜值不可靠(我检查了 2000 年的记录)
我需要什么:我需要快速可靠的解决方案
预期如下表:
SumOfAccountBalance transactiontime
98,721 2021-03-21 10:01:00
339,464 2021-04-22 01:01:00
480,447 2021-04-23 01:01:00
540,863 2021-04-23 02:01:00
1,129,017 2021-04-23 03:01:00
1,168,730 2021-04-23 15:01:00
最终预期:
MinCriticalPointAccountBalance transactiontime
98,721 2021-03-21 10:01:00
解决方案
推荐阅读
- java - 如何在 Android Studio 中单击按钮时创建一个新按钮?
- wordpress - 如何将字体真棒添加到自定义文字新闻片段
- angularjs - AngularJS中打开天气应用程序的输出错误
- python - 我的基于矩阵的反向传播算法有什么问题?
- asp.net-mvc - 如何使用 FTP 或使用代码优先迁移的文件系统发布方法更新远程数据库
- java - 从 Resttemplate 调用时,不支持请求方法“PUT”
- spark-ar-studio - 我们可以在 Spark AR 中跟踪快乐、悲伤、愤怒等面部情绪吗?
- large-data - 大规模线性约束凸二次优化 - R/Python/Gurobi
- stream - WebRTC videochat p2p:从本地流切换到 p2p 流
- php - make $user 未定义 使变量在刀片模板中成为可选。将 {{ $user }} 替换为 {{ $user ?? '' }}