【发布时间】:2018-10-05 16:53:43
【问题描述】:
谁能给我解释一下,也许可以提出一个更好的方法。
为什么 checksum(0.0280) = checksum(-0.0280) ? 投射到浮动可以解决它,但我不愿意这样做,我宁愿找到解决这个问题的方法。
LE:我试图让事情保持简单,就像这里的大多数问题一样,这是在生产中出现的东西,并且放置整个数据库结构有点矫枉过正。 我会尝试更好地解释它。我有一些动态结构表(在终端用户通过 Web 应用程序控制结构的意义上是动态的),它们具有以下粗略结构:Id (int)、StartDate、FKey1 (nvarchar)、Value1(十进制或 nvarchar 或 int),值 2 ... 值 N。
这个表可以填充(再次,由最终用户)冗余数据(数百万行),在一些计算过程中,我想整理这个表,只留下相关信息。整理它的方法是删除连续的相同行(日期除外)。为了性能,我想避免单独检查每一列,所以 CHECKSUM 派上用场了,因为它还支持多列作为输入。
【问题讨论】:
-
“解决”是什么意思?你想做什么?
-
sql server 中的小数,还是个迷宫!如果您不指定数据类型(十进制或浮点数),您的结果大多是不正确的。例如,如果您在没有强制转换的情况下执行
SELECT (1/100),您将得到一个 0,将其中一个强制转换为十进制或浮点数,您将得到 0.01。所以如果你想直接在 T-SQL 中写一个数字,你需要指定数据类型。 (所以我假设 0.0280 被读取为 0 对于校验和,并且转换为浮点数或小数将修复它。 -
我添加了更多细节
-
为了性能,我想避免单独检查每一列,所以 CHECKSUM 派上用场了,因为它还支持多列作为输入。正确索引的列肯定会胜过非索引校验和列。其他人提出了很多建议,但出于性能原因,它们似乎都不适合。
-
一种常见的模式是首先使用校验和来大大减少匹配的数量,然后根据该结果,实际比较各个列以解决冲突
标签: sql-server checksum