mysql字段数值累加_[20191021]数值累加的各种方法.txt

[20191021]数值累加的各种方法.txt

--//前几天跟别人的聊天,提及前一阵子给别人出的面试题.

--//给出一个文本都是数字,每行1个数值.计算累加结果.结果对方提及大部分人都没有做出来.

--//仅仅一个给出一个方法就是导入数据库,然后计算(dba的思维方式),可能是太紧张,上机没有做出来.

--//当然如果能上网,我估计大部分人都可以做出来.

--//实际上方法很多,我个人的要求是你最后算出来就可以了.做一个例子测试看看.

$ cat a.txt

301000.0000

293000.0000

66000.0000

182000.0000

98000.0000

252914.5300

235000.0000

300000.0000

330000.0000

1.方法1使用awk:

$ awk '{sum+=$1} END {printf("%.10f\n",sum)}' a.txt

2057914.5300000000

--//使用awk估计是最常用的方式.也是我不熟悉的方式.

2.使用paste+bc:

$ paste -sd+ a.txt | bc

2057914.5300

--//利用paste -s功能,不过手册提示-s的功能是

--//-s, --serial paste one file at a time instead of in parallel,有点不是很理解.

3.实际上方法还很多:

$ cat a.txt |xargs | sed 's/ /+/g' | bc

2057914.5300

$ cat a.txt | (tr '\n' '+' ; echo 0 ) | bc

2057914.5300

$ (sed -e 's/^/s+=/g'  a.txt ; echo s ) | bc

2057914.5300

--//这种方式我估计效率很低,如果记录很多的情况下.但是好处就是如果记录不多还是不错的,不会出现输入缓存溢出的情况..

--//而前面的方式如果记录很多,会出现输入缓存溢出的情况,执行时会报错.例子:

$ seq 1000 | paste -sd+ | bc

500500

$ seq 10000 | paste -sd+ | bc

(standard_in) 1: Function too big.

4.使用dc计算器:

--//dc计算器采用压栈出栈方式,也就是后缀方式.例子:

$ echo 1 2 + pq | dc

3

--//本例子使用dc的难点是需要输出多少+.

$ (cat a.txt ; seq $(($(cat a.txt |wc -l ) -1 ))|xargs -I {} echo '+' ;echo pq ) | dc

2057914.5300

--//bing检索,找到一个不用计算输入多少加号的方法.

$ cat a.txt | dc -f - -e '[+z1

2057914.5300

--//-e后面那一串什么意思,即使看了man dc文档,我也没看懂表示什么意思.

5.测试导入数据库的方式:

SCOTT@test01p> @ ver1

PORT_STRING                    VERSION        BANNER                                                                               CON_ID

------------------------------ -------------- -------------------------------------------------------------------------------- ----------

IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

SCOTT@test01p> create table tt ( a number);

Table created.

$ cat a.txt | xargs -I {} echo insert into tt values ({})

$ cat a.txt | xargs -I {} echo "insert into tt values (  {} )  " | sqlplus -s -l scott/btbtms@test01p

...

SCOTT@test01p> select sum(a) from tt;

SUM(A)

----------

2057914.53

--//理论讲这么不算一种方法.也可以使用sqlldr导入.不过有点奇怪的是windows下cvs文件格式必须是dos的.

--//不然导入报错.

$ cp a.txt tt.dat

--//修改文件tt.dat格式为dos,导入:

D:\tools\cygwin64\home\Administrator\test> sqlldr scott/btbtms@test01p table=tt

sqlldr scott/btbtms@test01p table=tt

SQL*Loader: Release 12.2.0.1.0 - Production on Mon Oct 21 20:24:57 2019

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.

Express Mode Load, Table: TT

Path used:      External Table, DEGREE_OF_PARALLELISM=AUTO

Table TT:

9 Rows successfully loaded.

Check the log files:

tt.log

tt_%p.log_xt

for more information about the load.

$ sqlplus -s -l  scott/btbtms@test01p <<< "select sum(a) from tt;"

SUM(A)

----------

2057914.53

--//一般bash编程并不太讲究执行效率,有机会测试记录很多的情况,那种方式快一些.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值