gpt4 book ai didi

sql - 如何在 SQL 中保持滚动校验和?

转载 作者:行者123 更新时间:2023-12-04 23:47:42 26 4
gpt4 key购买 nike

我正在尝试保留滚动校验和以说明顺序,因此采用之前的“校验和”并将其与当前校验和进行异或并生成新的校验和。

Name      Checksum     Rolling Checksum
------ ----------- -----------------
foo 11829231 11829231
bar 27380135 checksum(27380135 ^ 11829231) = 93291803
baz 96326587 checksum(96326587 ^ 93291803) = 67361090

我该如何完成这样的事情?

(注意,计算完全是虚构的,仅供引用)

最佳答案

这基本上是 running total问题。

编辑:

我最初的主张是,这是基于游标的解决方案实际表现最佳的少数几个地方之一。三角自连接解决方​​案的问题在于,它会反复重新计算相同的累积校验和作为下一步的子计算,因此随着行数的增加,所需的工作量呈指数增长,因此可扩展性不强。

Corina 的回答使用了“古怪的更新”方法。我已经调整它来执行校验和,并且在我的测试中发现游标解决方案花费了 3 秒而不是 26 秒。两者都产生了相同的结果。不幸的是,它依赖于更新行为的一个未记录的方面。我肯定会阅读讨论 here在决定是否在生产代码中依赖它之前。

描述了第三种可能性here (使用 CLR)我没有时间测试。但是来自the discussion here这似乎是一个很好的可能性,可以在显示时计算运行总计类型的东西,但在必须保存计算结果时由游标执行。

CREATE TABLE TestTable
(
PK int identity(1,1) primary key clustered,
[Name] varchar(50),
[CheckSum] AS CHECKSUM([Name]),
RollingCheckSum1 int NULL,
RollingCheckSum2 int NULL
)


/*Insert some random records (753,571 on my machine)*/
INSERT INTO TestTable ([Name])
SELECT newid() FROM sys.objects s1, sys.objects s2, sys.objects s3

方法一:基于 Jeff Moden文章

DECLARE @RCS int

UPDATE TestTable
SET @RCS = RollingCheckSum1 =
CASE WHEN @RCS IS NULL THEN
[CheckSum]
ELSE
CHECKSUM([CheckSum] ^ @RCS)
END
FROM TestTable WITH (TABLOCKX)
OPTION (MAXDOP 1)

方法二 - 使用与 Hugo Kornelis 在该文章的讨论中提倡的相同的游标选项。

SET NOCOUNT ON
BEGIN TRAN

DECLARE @RCS2 INT
DECLARE @PK INT, @CheckSum INT

DECLARE curRollingCheckSum CURSOR LOCAL STATIC READ_ONLY
FOR
SELECT PK, [CheckSum]
FROM TestTable
ORDER BY PK

OPEN curRollingCheckSum

FETCH NEXT FROM curRollingCheckSum
INTO @PK, @CheckSum

WHILE @@FETCH_STATUS = 0
BEGIN

SET @RCS2 = CASE WHEN @RCS2 IS NULL THEN @CheckSum ELSE CHECKSUM(@CheckSum ^ @RCS2) END


UPDATE dbo.TestTable
SET RollingCheckSum2 = @RCS2
WHERE @PK = PK

FETCH NEXT FROM curRollingCheckSum
INTO @PK, @CheckSum

END

COMMIT

测试它们是否相同

SELECT * FROM TestTable
WHERE RollingCheckSum1<> RollingCheckSum2

关于sql - 如何在 SQL 中保持滚动校验和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266562/

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