老师您好,我想请教一下老师这个问题

老师您好,我想请教一下老师这个问题

老师您好,我想请问一下这样子查询会不会对性能有影响,如果有影响,有没有什么方法可以优化?

代码如下:

SELECT 
    sum(count_mid)
FROM (SELECT
    count(mid) as count_mid
From movie
GROUP BY mid
HAVING round(avg(score), 2) > 
(SELECT
    round(avg(score), 2)
FROM movie)


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小猿 2022-08-20 14:51:14

同学,你好!同学的sql 语句是报错的,老师这边无法确定同学的sql 思路,祝学习愉快~

  • 提问者 TheCreamPuff #1

    不好意思老师,这里少了个括号

    # TODO: 查询大于平均分的电影的数量
    SELECT 
        sum(count_mid)
    FROM (SELECT
        count(mid) as count_mid
    From movie
    GROUP BY mid
    HAVING round(avg(score), 2) > 
    (SELECT
        round(avg(score), 2)
    FROM movie))

    文件:u.data(一共有十万条,暂时截几百条)

    用户ID,电影ID, 评分, 时间

    uid mid score ts

    196 242    3  881250949
    186    302    3  891717742
    22 377    1  878887116
    244    51 2  880606923
    166    346    1  886397596
    298    474    4  884182806
    115    265    2  881171488
    253    465    5  891628467
    305    451    3  886324817
    6  86 3  883603013
    62 257    2  879372434
    286    1014   5  879781125
    200    222    5  876042340
    210    40 3  891035994
    224    29 3  888104457
    303    785    3  879485318
    122    387    5  879270459
    194    274    2  879539794
    291    1042   4  874834944
    234    1184   2  892079237
    119    392    4  886176814
    167    486    4  892738452
    299    144    4  877881320
    291    118    2  874833878
    308    1  4  887736532
    95 546    2  879196566
    38 95 5  892430094
    102    768    2  883748450
    63 277    4  875747401
    160    234    5  876861185
    50 246    3  877052329
    301    98 4  882075827
    225    193    4  879539727
    290    88 4  880731963
    97 194    3  884238860
    157    274    4  886890835
    181    1081   1  878962623
    278    603    5  891295330
    276    796    1  874791932
    7  32 4  891350932
    10 16 4  877888877
    284    304    4  885329322
    201    979    2  884114233
    276    564    3  874791805
    287    327    5  875333916
    246    201    5  884921594
    242    1137   5  879741196
    249    241    5  879641194
    99 4  5  886519097
    178    332    3  882823437
    251    100    4  886271884
    81 432    2  876535131
    260    322    4  890618898
    25 181    5  885853415
    59 196    5  888205088
    72 679    2  880037164
    87 384    4  879877127
    290    143    5  880474293
    42 423    5  881107687
    292    515    4  881103977
    115    20 3  881171009
    20 288    1  879667584
    201    219    4  884112673
    13 526    3  882141053
    246    919    4  884920949
    138    26 5  879024232
    167    232    1  892738341
    60 427    5  883326620
    57 304    5  883698581
    223    274    4  891550094
    189    512    4  893277702
    243    15 3  879987440
    92 1049   1  890251826
    246    416    3  884923047
    194    165    4  879546723
    241    690    2  887249482
    178    248    4  882823954
    254    1444   3  886475558
    293    5  3  888906576
    127    229    5  884364867
    225    237    5  879539643
    299    229    3  878192429
    225    480    5  879540748
    276    54 3  874791025
    291    144    5  874835091
    222    366    4  878183381
    267    518    5  878971773
    42 403    3  881108684
    11 111    4  891903862
    95 625    4  888954412
    8  338    4  879361873
    162    25 4  877635573
    87 1016   4  879876194
    279    154    5  875296291
    145    275    2  885557505
    119    1153   5  874781198
    62 498    4  879373848
    62 382    3  879375537
    28 209    4  881961214
    135    23 4  879857765
    32 294    3  883709863
    90 382    5  891383835
    286    208    4  877531942
    293    685    3  888905170
    216    144    4  880234639
    166    328    5  886397722
    250    496    4  878090499
    271    132    5  885848672
    160    174    5  876860807
    265    118    4  875320714
    198    498    3  884207492
    42 96 5  881107178
    168    151    5  884288058
    110    307    4  886987260
    58 144    4  884304936
    90 648    4  891384754
    271    346    4  885844430
    62 21 3  879373460
    279    832    3  881375854
    237    514    4  879376641
    94 789    4  891720887
    128    485    3  879966895
    298    317    4  884182806
    44 195    5  878347874
    264    200    5  886122352
    194    385    2  879524643
    72 195    5  880037702
    222    750    5  883815120
    250    264    3  878089182
    41 265    3  890687042
    224    245    3  888082216
    82 135    3  878769629


    2022-08-20 15:10:44
  • 好帮手慕小猿 回复 提问者 TheCreamPuff #2

    同学,你好!老师理解同学查询大于平均分电影数量的sql 语句思路是这样的,是按电影mid 进行分组取该电影的平均分,并且该电影平均分大于movie表所有数据的平均分才是满足条件的电影,然后对满足条件的电影mid数量统计。不知道同学计算的是这样的逻辑吗?若是这样觉得同学的sql 不正确,请看数据
    https://img1.sycdn.imooc.com//climg/6300a2110903ff3002280295.jpg
    mid为1的电影它的平均分约是63.33

    mid 为2的电影平均分是83.25
    mid 为3的电影平均分是76 
    所有记录平均分是75.1
    最后电影的平均分大于总平均分的应该是mid是2,3的电影,结果应是2条电影
    sql 语句应是:
    https://img1.sycdn.imooc.com//climg/6300a38309ed875003970326.jpg

    SELECT 
        count(a.mid)
    FROM (SELECT
       mid 
    From movie
    GROUP BY mid
    HAVING round(avg(score), 2) > 
    (SELECT
        avg(score)
    FROM movie))a

    若与思路不同,同学可以详细说下思路,方便解决同学的问题。祝学习愉快~



    2022-08-20 17:13:36
  • 提问者 TheCreamPuff 回复 好帮手慕小猿 #3

    首先

    # 求平均分
    SELECT
        round(avg(score), 2)
    FROM movie

    https://img1.sycdn.imooc.com//climg/6300ae330926d7ad03000171.jpg

    然后

    # 用HAVING嵌套,判断大于平均分的各个电影的数量
    SELECT
        count(mid) as count_mid
    From movie
    GROUP BY mid
    HAVING round(avg(score), 2) > 
    (SELECT
    round(avg(score), 2)
    FROM movie)

    https://img1.sycdn.imooc.com//climg/6300af10097577ad01600828.jpg

    最后

    # 用sum的聚合函数,将各个电影的数量相加,得到 大于平均分的电影的数量
    SELECT 
        sum(count_mid)
    FROM (SELECT
        count(mid) as count_mid
    From movie
    GROUP BY mid
    HAVING round(avg(score), 2) > 
    (SELECT
        round(avg(score), 2)
    FROM movie))

    https://img1.sycdn.imooc.com//climg/6300af9409d37a9902320163.jpg


    另外一种是dsl风格的求法(这个不是SQL语法的,所以一开始没放上来,仅供参考)

    from pyspark.sql import functions as F
    (df.where(df[] >
                                   df.select(F.avg(df[])).first()[]).count())

    https://img1.sycdn.imooc.com//climg/6300b014096ae7d903570041.jpg

    (这是我百度找的一种处理方法,跟我用sql风格处理的输出结果不一样)

    2022-08-20 17:59:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师