学习要深入

 最近遇到一个这样的问题,有如下一个表:

ID  item_name  price sell_id  buy_id  date

1   MP3        100    11        12    2015-8-12

2   apple     12     7         11  2015-8-20

3   mp3       95     3         14  2015-7-14

4   风扇      25     1         7   2015-4-6

5   Apple     25     2         8     2015-7-25

6   cup        8     34        14  2015-8-11

要求:

(1)写一个Sql完成列出每个商品的平均价钱。

(2)列出平均价钱最高的前3个商品。

其实本来并不太难,如下的Sql就能完成:

1select item_name,avg(price) from test.goods group by item_name;

2select item_name,avg(price) as avpri from test.goods group by item_name order by avg(price)  Desc limit 3;

但是当我被问到以下几个问题的时候,就迷惑了:

(1)第一个SQL语句能不能把MP3mp3当成一个商品,会不会区分大小写?

(2)第二个SQLorder by后面的avg(price)会出错应该怎么处理?

当时一个子就晕了,是不是应该加个不区分大小写的操作,可是应该是什么呢?没有想到。如果order by 后面不能跟avg()函数,应该怎么办呢?

   我是比较喜欢挑战的,虽然我可能一时想不起来,不过后来还是会想尽办法,找到答案的。后来经常亲自尝试,发现被忽悠了。Sql本来就不区分大小写的,而且order by后面是可以跟函数的,而且还可以用下面的方法,看起来好像比直接跟函数的好:

select item_name,avg(price) as avpri from test.goods group by item_name order by avpri Desc limit 3;

是我自己学艺不精,不能怪人家的。

现在讨论第二个问题:

如果上面的这个不是数据库,是文件,如何输出每件商量的平时值,以及如何输出平均值最高的前3个商品?

思路分析:

(1)读取文件,将每一行中的数据读取出来,并拆分出每个字段。

(2)以商品名为key,统计出每种商品的总价钱以及每种商品数

(3)求出每种商品的平时价钱

(4)对商品按价钱排序,降序排列

(5)输出前三种商品的商品名和平均价钱。

思路清晰,不过有些儿细节上的问题还是没有考虑到,经过调试和修改,最终的脚本如下:

1,          数据文件GoodsMessge.txt文件,内容同上面的数据库。

2,          脚本文件,内容如下:

1,      #!/usr/bin/env python

2,      # -*- coding: utf_8 -*-

3,      class readfile:

4,          '''

5,          分析数据文件

6,          '''  

7,          def checkfile(self):

8,              sum1={}

9,              cut1={}

10,            ave={}

11,            file1=open("GoodsMessage.txt")

12,            for line in file1.readlines():

13,                key=line.split()       

14,                #按分类统计总金额和商品个数

15,                if key[2].isdigit():

16,                    if sum1.has_key(key[1].lower()):

17,                        sum1[key[1].lower()]=sum1[key[1].lower()]+float(key[2])

18,                        cut1[key[1].lower()]=cut1[key[1].lower()]+1

19,                    else:

20,                        sum1[key[1].lower()]=float(key[2])

21,                        cut1[key[1].lower()]=1 

22,                        

23,            for key in sum1.keys():           

24,                ave[key]=sum1[key]/cut1[key]

25,                #print key,ave[key]

26,            #平均值排序   

27,            ave1=sorted(ave.iteritems(),key=lambda a:a[1],reverse=True)

28,            #print ave1              

29,            for i in range(0,3):

30,                print "商品名:",ave1[i][0],"平均价格:",ave1[i][1]

31,                          

32,    rf=readfile()

33,    rf.checkfile()

34,                  

先按商品名对商品的价钱进行统计,并且统计商品的个数;如果这个商品没有统计过,就将相应的key对应的Value置为这个数,如果有统计,就相加。代码对应15-21行,标题这一行不予统计。

然后算出每件商品的平均价格,23-24行存放到字典ave中。对ave中按平均价格进行排序,降序存放到ave1中,此是的ave1是一个list类型的。

循环输出前三个商量的商品名和平均价格,达到要求。当我的思路明确后,我对求平均值和排序这些儿细节性的东西,没有想到具体的解决办法。这说明大的方向我学的还是可以的,小到细节,或是更加深入的方面,没有学到家。明白了自己的缺点,以后得好好深入学习。不过我个人认为,思路才是最重要的,你可以不会细节,但一定要有解决问题的办法。然后借助于网络,通过自己的尝试,总能找到具体的解决方案的。

posted @ 2015-08-14 16:40  潜龙9527  阅读(134)  评论(0编辑  收藏  举报