sql 简单减法

sql 简单减法,第1张

select (sum2.总用户数 - sum1.退订用户数) as 未退定用户数 from

(select count(*) as 总用户数 from sms_user where smcode='a' ) sum2 ,

(select count(*) as 退订用户数 from sms_user where smcode='a' and endtime<>'') sum1

数据结构算法:CRC32算法实现原理

简而言之,CRC是一个数值。该数值被用于校验数据的正确性。CRC数值简单地说就是通过让你需要做处理的数据除以一个常数而得到的余数。当你得到这个数值后你可以将这个数值附加到你的数据后,当数据被传送到其他地方后,取出原始数据(可能在传送过程中被破坏)与附加的CRC数值,然后将这里的原始数据除以之前那个常数(约定好的)然后得到新的CRC值。比较两个CRC值是否相等即可确认你的数据是否在传送过程中出现错误。

那么,如何让你的数据除以一个常数?方法是对你的数据进行必要的编码处理,逐字节处理成数字。

那么这个常数是什么?你不必关注它是什么,也不需要关注它是如何获得的。当你真的要动手写一个CRC的实现算法时,我可以告诉你,CRC的理论学家会告诉你。不同长度的常数对应着不同的CRC实现算法。当这个常数为32位时,也就是这里所说的CRC32。

以上内容你不必全部理解,因为你需要查阅其他资料来获取CRC完整的理论介绍。

The mathematics behind CRC ?

很多教科书会把CRC与多项式关联起来。这里的多项式指的是系数为0或1的式子,例如:a0 + a1*x + a2*x^2 + ... + an*x^n。其中a0, a1, ..., an要么为0要么为1。我们并不关注x取什么值。

(如果你要关注,你可以简单地认为x为2) 这里把a0, a1, ..., an的值取出来排列起来,就可以表示比特流。例如 1 + x + x^3所表示的比特流就为:1101。部分资料会将这个顺序颠倒,这个很正常。

什么是生成多项式?

所谓的生成多项式,就是上面我所说的常数。注意,在这里,一个多项式就表示了一个比特流,也就是一堆1、0,组合起来最终就是一个数值。例如CRC32算法中,这个生成多项式为:c(x) = 1 + x + x^2 + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^16 + x^22 + x^23 + x^26 + x^32。其对应的数字就为:11101101101110001000001100100000(x^32在实际计算时隐含给出,因此这里没有包含它的系数),也就是0xEDB88320(多项式对应的数字可能颠倒,颠倒后得到的是0x04C11DB7,其实也是正确的)。

由此可以看出,CRC值也可以看成我们的数据除以一个生成多项式而得到的余数。

如何做这个除法?

套用大部分教科书给出的计算方法,因为任何数据都可以被处理成纯数字,因此,在某种程度上说,我们可以直接开始这个除法。尽管事实上这并不是标准的除法。例如,我们的数据为1101011011(方便起见我直接给二进制表示了,从这里也可以看出,CRC是按bit进行计算的),给定的生成多项式(对应的值)为10011。通常的教科书会告诉我们在进行这个除法前,会把我们的数据左移几位(生成多项式位数-1位),从而可以容纳将来计算得到的CRC值(我上面所说的将CRC值附加到原始数据后)。但是为什么要这样做?我也不知道。(不知道的东西不能含糊过)那么,除法就为:

1100001010

_______________

10011 ) 11010110110000 附加了几个零的新数据

10011......... 这里的减法(希望你不至于忘掉小学算术)是一个异或 *** 作

-----.........

10011........

10011........

-----........

00001....... 逐bit计算

00000.......

-----.......

00010......

00000......

-----......

00101.....

00000.....

-----.....

01011....

00000....

-----....

10110...

10011...

-----...

01010..

00000..

-----..

10100.

10011.

-----.

01110

00000

-----

1110 = 这个余数也就是所谓的CRC值,通常又被称为校验值。

希望进行到这里,你可以获取更多关于CRC的感性认识。而我们所要做的,也就是实现一个CRC的计算算法。说白了,就是提供一个程序,给定一段数据,以及一个生成多项式(对于CRC32算法而言该值固定),然后计算得出上面的1110余数。

--1:先查询看是否是你所要的结果

select t1.名称,t1.数量,t2.单价*(t1.数量-t2.数量) as 合计价格

from 表A t1,

表B t2

where t1.名称=t2.名称

and t1.单价=t2.单价

--2:更新表A的数据

update t1

set 数量=t1.数量-t2.数量 ,和合计价格=t2.单价*(t1.数量-t2.数量)

from 表A t1,

表B t2

where t1.名称=t2.名称

and t1.单价=t2.单价

--如果上面的结果不行就分开写

--先更新数量

update t1

set 数量=t1.数量-t2.数量

from 表A t1,

表B t2

where t1.名称=t2.名称

and t1.单价=t2.单价

--在更新价格

update t1

set 和合计价格=t2.单价*t1.数量

from 表A t1,

表B t2

where t1.名称=t2.名称

and t1.单价=t2.单价


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10863409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存