• SQL查找每个城市购买金额排名第二的用户,列出其购买城市、姓名、购买金额(排序函数)


    【面试题】某公司数据库里有3张表,销售订单表、产品明细表、销售网点表

     

    ”销售订单表”记录了销售情况,每一张数据表示哪位顾客、在哪一天、哪个网点购买了什么产品,购买的数量是多少,以及对应产品的零售价

    销售订单表、产品明细表、销售网点表字段之间的关系如下

    销售订单表和产品明细表通过“产品”字段关联,销售订单表和销售网点通过“交易网点”关联

    【问题】查找每个城市购买金额排名第二的用户,列出其购买城市、姓名、购买金额

    【解题思路】

    此题逻辑上有3步:

    1)第一步每个城市每个用户总的购买金额

    2)第二步找出购买金额第二的用户

    3)第三步分组列出购买城市、姓名、购买金额

    1.每个城市每个用户总的购买金额

    需要“销售网点表”、”销售订单表”进行多表联结

    1. select
    2. c.城市,
    3. a.顾客ID,
    4. sum(a.销售数量*a.零售价格) as 购买金额
    5. from 销售订单表 as a
    6. inner join 销售网点表 as c
    7. on a.交易网点=c.交易网点
    8. group by c.城市,a.顾客ID;

    2.找出购买金额第二的用户

    把上一步的查询结果记录为临时表t1。这个是典型的排名问题,要想到《猴子 从零学会SQL》里讲过的用窗口函数来实现

    因有可能销售金额的是一样的,避免漏下,因此用窗口函数dense_rank对购买金额进行排序

    1. select
    2. t1.城市,
    3. t1.顾客ID,
    4. t1.购买金额,
    5. dense_rank() over (partition by t1.城市
    6. order by t1.购买金额 desc) as 排名
    7. from t1;

    3.找出排名第二名的用户

    上面排名后,就可以用where筛选出排名第二名的用户

    1. select
    2. t1.城市,
    3. t1.顾客ID,
    4. t1.购买金额,
    5. dense_rank() over (partition by t1.城市
    6. order by t1.购买金额 desc) as 排名
    7. from t1
    8. where 排名=2;

    我们把第1步得到的t1表示的SQL带入上面,就得到了最终SQL

    1. select
    2. t1.城市,
    3. t1.顾客ID,
    4. t1.购买金额,
    5. dense_rank() over (partition by t1.城市
    6. order by t1.购买金额 desc) as 排名
    7. from (
    8. select
    9. c.城市,
    10. a.顾客ID,
    11. sum(a.销售数量*a.零售价格) as 购买金额
    12. from 销售订单表 as a
    13. inner join 销售网点表 as c
    14. on a.交易网点=c.交易网点
    15. group by c.城市,a.顾客ID
    16. ) as t1
    17. where 排名=2;

    【本题考点】

    1.排名问题,要想到使用窗口函数来进行排序。

    2.排序函数有3个比较常用的,需要区分各个函数的输出结果:

    row_number(): 返回结果为连续的排序:1,2,3,4,5...

    rank(): 返回结果为跳跃排序,也就是为相同数值的行输出相同排序结果,对于下一行不同的数据将返回行号:1,1,3,4...

    dense_rank(): 返回结果为连续排名,排名值没有间断:1,1,2,3,4...

  • 相关阅读:
    MATLAB | 那些你不得不知道的MATLAB小技巧(二)
    解决yolov5权重在linux和Windows上不兼容的问题
    HiveServer2 简单用户/密码身份验证
    基于docker-k8s的web集群
    独立站引流,转化率不高怎么做
    Ganglia python metric扩展
    【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理
    基于pytorch使用特征图输出进行特征图可视化
    【Spring Boot 源码学习】OnClassCondition 详解
    稳定性实践:开关和预案
  • 原文地址:https://blog.csdn.net/qq_41404557/article/details/126268626