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

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

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

代码如下:

1
2
3
4
5
6
7
8
9
10
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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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

    首先

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

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

    然后

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 用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

    最后

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 用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下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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