groupby分组的应用,第1张

groupby分组的应用,第2张

第五节分组应用

首先,我们来谈谈分组是如何工作的。例如:

表:temp1有以下记录:

SL
AAA 1
AAA 4
cc C2
bb b5
AAA 9
BBB 7
现在,该数一数temp1有多少种数,各类数的总数是多少了。很明显,这是在利用分组。

sele bh,sum(sl)as total _ sl;
从temp1
BH集团;
由bh订购;
into curs temp 2
命令的操作过程就像投票选举中的计票过程。我不知道它用什么样的技术来存储中间结果,但这并不重要。我现在假设它用的是临时表(其实我觉得不太可能),对结果没有影响,但是很好理解。

1.逐一扫描记录。每遇到一个新号码,就为这个号码创建一个临时表(还是那句话,使用临时表只是我假设的布局,不知道真实的处理方法),然后把记录的内容放到对应的临时表中。如果不是新号,就把记录内容放到对应的临时表中。

2.扫描完所有记录后,还生成了与各种数字相对应的临时表格。现在,sum()用于统计每个临时表。例如,如果编号为“aaa”的临时表是cursor1,则它的内容是:

1
AAA 4
AAA 9
现在开始计算sum(),其效果相当于从游标1开始计算selebh,sum (sl)作为total _ sl。每个编号的临时表都要做这样的sum()统计,然后把每个编号的统计结果组合起来,就像用union一样。最后的结果是:

AAA 14
cc C2
BBB 12
3,然后对bh排序,结果是:

AAA 14
BBB 12
CCC 2
看了上面的例子和下面的命令,我想你也能理解了:

sele cpk.cpbh,cpk.cpmc,sum(iif(isnull(thdmx.thsl),0,thdmx.thsl)作为total _ thsl
from cpk left join th DMX;
on cpk . cpbh = th DMX . cpbh;
group by cpk . cpbh;
orde by cpk . cpbh;
into curs temp1
产品表与左边的发货计划相链接,因此未被提及的产品对应的发货数量在链接的临时表中为空值。分组后,第一步完成后生成的临时表中仍有空值,所以第二步执行sum命令时会使用iif(isnull())进行过滤。过滤的结果是将空值改为0,其余保持不变,然后求和。最后一步再排序,结果出来了。

以上是分组最基本的用法。现在我们来谈谈分组的一些怪异用法。

1.使用recn()。示例1:

有一种情况。一大段数字本来应该是连续的,但是中间漏了一些数字。现在我们必须找出这些遗漏的数字。恐怕很多人,一方面用scan endscan,一方面用一些中间变量作为判断的依据。最后,写出来的代码有很长的一段,运行起来极其缓慢。但是如果采用下面的方法,我想即使不是也是好的。数据如下:

1,6,3,5,2,7,9,10,15,16
在这些数据中,找出缺失的4,8,11,12,13,14。

1.先排序。

selbh from temp 1 orde by BH into curs temp 1
结果是:

1,2,3,5,6,7,9,10,15,16
如果源表中物理记录的顺序与数字的顺序相同,则不需要进行这一步。

2.取temp1中每条记录的recn(),即记录号,然后用该号减去记录号。

Selbh,val (BH-recn())作为aa从temp1放入curs temp2
结果是:

1 0 2 0 3 0 5 1 7 1 9 2 10 2 15 6

Selmin (BH) as min BH,max (BH) as max BH从temp 2 grou by aa到curs te MP3
结果如下:

minbh maxbh
1 3
5 7
9 10
15 16
4。现在结果很明显。一个记录的最小BH和它上面的记录的最大BH之差就是缺失数。现在很容易使用scan endscan。

上述方法只有在数据量很大,第三步的结果远小于源表的结果时才有效。因为扫描的速度比不上Select-SQL,而且要做条件判断。这种方法虽然使用了两个全遍历SQL命令,但是这是一个没有过滤条件的SQL命令,速度很快,但是需要更多的时间进行分组。同时,它只适用于号码不重复的情况。如果有重复的数字,那么在第一步中,使用:

selbh from temp 1 goru by BH orde by BH into curs temp 1
去掉多余的数字。如果你想知道那些数字是重复的,你可以用:

Selbh,coun (BH) as aa从temp 1 grou by bhorde by bhhavi aa > 1到curs temp 1
结果是重复数,对应的aa字段是重复数。

第二步,好像不用两个命令就能得到结果,不过我还没想到。我想知道你对此有什么看法。

上面的方法有一个缺点:它使用了sum()函数,只能统计数值型数据,其他的字符型和日期型都不能统计。所以如果想把一个表中记录的所有产品名称串成一个字符串,是不行的。但是对于日期类型,有时候还是可以用的。

第二,日期相减的结果是一个数值,所以可以使用sum()函数。示例2

编号存储日期
1 NIC 2000 . 09 . 02
1 NIC 2000 . 09 . 03
1 NIC 2000 . 09 . 05
2 VFP 2000 . 09 . 05
2 VFP

名称入库日期(表2和表1结构相同)
1网卡2000.09.03
1网卡2000 . 09 . 05
2 VFP 2000 . 09 . 06

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » groupby分组的应用

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情