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

69 篇文章 15 订阅
订阅专栏

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

 

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

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

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

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

【解题思路】

此题逻辑上有3步:

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

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

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

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

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


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

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

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

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


select 
    t1.城市,
    t1.顾客ID,
    t1.购买金额,
    dense_rank() over (partition by t1.城市 
                 order by t1.购买金额 desc) as 排名
from t1;

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

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


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

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


select 
    t1.城市,
    t1.顾客ID,
    t1.购买金额,
    dense_rank() over (partition by t1.城市 
                 order by t1.购买金额 desc) as 排名
from (
select 
    c.城市,
    a.顾客ID,
    sum(a.销售数量*a.零售价格) as 购买金额
from 销售订单表 as a 
inner join 销售网点表 as c
on a.交易网点=c.交易网点
group by c.城市,a.顾客ID
) as t1
where 排名=2;

【本题考点】

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

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

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

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

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

SQL统计城市商品销量&对应销量排名
weixin_45260063的博客
05-16 740
-代替窗口函数不支持distinct的功能的,count(distinct(a.storecode)) over(partition by XXX))----and b.city in ('东莞市','广州市','深圳市')----distinct 去除重复数据----运用窗口函数排序、增加排名列----城市大类销量与排名
sql查询最大的见多了,查询第二的呢???
weixin_33815613的博客
09-18 1265
问题:    数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度。   建表语句 create table users ( id int identity(1,1) primary key, name varchar(20), height float );   数据库表:用户表(Users) 数据库...
MYSQL sql 查询每个班级的第二
duansir的专栏
05-08 9117
面试题碰到的,做出来看一下SELECT MAX(SCORE) AS second,class FROM sl_student WHERE SCORE NOT IN (SELECT MAX(SCORE) FROM sl_student group by class)GROUP BY class
sql查询第二大的记录(转)
weixin_34130269的博客
09-19 695
问题:  数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度。建表语句 create table users ( id int identity(1,1) primary key, name varchar(20), height float ); 测试数据 insert into users(name,height)...
提取所有用户第二个订单信息
sjzwenzi的专栏
12-13 601
SELECT id FROM ( SELECT @rownum:=@rownum+1 AS rownum,# 行号 IF(@x=uo.apply_id,@rank:=@rank+1,@rank:=1) rank,#处理排名,如果@x等于user_id,则表示@x被初始化,将@rank自增1 @x:=uo.apply_id, # 初始化@x,@x为中间变量,在rank之后初始化,所
帆软《零基础快速自学SQL第二部分练习题及答案(Mysql
11-05
在帆软的《零基础快速自学SQL》课程的第二部分中,学员们会遇到一系列针对MySQL数据库的练习题,旨在帮助他们巩固和提升SQL查询能力。以下是对这些练习题的知识点解析: 1. **查找供应商名称及其所在城市**:这需要...
SQL培训第一期
03-14
获取每个组织,考试成绩前三名。 1.9 存储过程 1.9.1 定义 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 1.9.2...
《MY-SQL实用教程》期末考精彩试题.docx
10-26
22. `SUBSTRING('长江长城黄河',2,2)`返回的是"长",从第二个字符开始取2个字符。 23. 与`NOT IN ('wh1', 'wh2')`功能相同的是`仓库号 != 'wh1' AND 仓库号 != 'wh2'`,表示仓库号既不是'wh1'也不是'wh2'。 24. ...
经典SQL语句大全
12-20
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) from ...
SQL性能优化
12-20
 以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL 都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则...
数据库:取排名第二
lyuasd的博客
08-06 581
题目: 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14...
SQL刷题01 查询第二名薪水
weixin_43943642的博客
11-30 175
SQL刷题01 获取当前(to_date=‘9999-01-01’)薪水第二多的员工的emp_no以及其对应的薪水salary CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL, `salary` int(11) NOT NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`)); 输出样例: emp_no salar
sqlserver 班级排名_Sql查询班级成绩排在第二位的是多少分?
weixin_30496999的博客
01-13 640
CREATE DATABASE kk;USE kk;CREATE TABLE fenshubiao( id INT PRIMARY KEY AUTO_INCREMENT,mingzi VARCHAR(10),fenshu FLOAT);DESC fenshubiaoINSERT INTO fenshubiao VALUES(NULL,'aa',95.0);第一种办法:SELECT MAX(fen...
sql语句(第二高)
无解
08-02 1765
编写一个 SQL 查询,获取 Employee表中第二高的薪水(Salary)。 +----+--------+ | Id | Salary | +----+--------+ | 1 | 100 | | 2 | 200 | | 3 | 300 | +----+--------+ 例如上述Employee表,SQL查询应该返回200 作为第二高的薪水。如果不存在...
sql 查询排行榜上当前用户排名
qq_37722674的博客
08-13 569
最近项目要实现一个分数排行榜的功能,既要所有人的排名名次,又要当前登录系统的用户的名次,查了好久都没找到性能友好的解决办法,直到看到下面这篇博客: @rownum解决名次问题 是很好的解决方式,我也多学到了sql语句的用法,到现在才知道还有@rownum这种用法…… 再贴一下图片防止链接挂掉: ...
查询出总分数排名第二到第四的同学
weixin_44488927的博客
06-29 556
在课程分数表course中,怎么查询出总分排在班里第二到第四名的同学呢?
SQL18 查找当前薪水排名第二多的员工编号emp_no
W_H_M_2018的博客
10-22 385
题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,你可以不使用order by完成吗 CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gend
数据库查找第二”的各种方法以及性能比较
u012434983的专栏
05-30 996
如何在一份成绩单中寻找到排名第二的学生,这是很常见的问题,本文中就给出几种解法并分析他们的性能。 假设数据如下: id score name 1 76 张三 2 100 李四 3 7 王五 4 85 秋柳 student_score
图解面试题:如何查找第N高的数据?
公众号(猴子数据分析)
01-02 2045
【题目】现在有“课程表”,记录了学生选修课程的名称以及成绩。现在需要找出语文课中成绩第二高的学生成绩。如果不存在第二高成绩的学生,那么查询应返回 null。【解题思路】1.找出所有选修了...
我想用SqlServer查询每个用户购买每个应用的分组累积购买金额改怎么写查询语句
最新发布
04-01
假设有三个表:用户表(User)、应用表(Application)和订单表(Order),其中订单表中包含了用户购买应用的信息(用户ID、应用ID、购买金额)。可以使用如下的SQL语句查询每个用户购买每个应用的分组累积购买金额: ``` SELECT u.UserName, a.ApplicationName, SUM(o.Amount) AS TotalAmount FROM User u INNER JOIN Order o ON u.UserID = o.UserID INNER JOIN Application a ON o.ApplicationID = a.ApplicationID GROUP BY u.UserName, a.ApplicationName ORDER BY u.UserName, a.ApplicationName ``` 上述SQL语句中,首先使用INNER JOIN将用户表、应用表和订单表连接起来,然后使用GROUP BY对用户和应用进行分组,最后使用SUM计算每个用户购买每个应用的累积购买金额。最终结果按照用户名和应用名称排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

分类专栏

  • 数据分析 1篇
  • 数据分析思维 2篇
  • 读书笔记 19篇
  • pandas 8篇
  • 数据可视化 5篇
  • excel 8篇
  • Python 13篇
  • 刷题 9篇
  • 习题 26篇
  • 爬虫 14篇
  • Leetcode 29篇
  • 分享 36篇
  • 爬虫 6篇
  • MySQL 14篇
  • SQL面试题 69篇
  • 考研历程 4篇
  • 笔记 4篇
  • 慕课题目 7篇
  • 蓝桥杯普及题 5篇
  • 算法计算经典 8篇
  • 视频例题 6篇
  • 课后习题 32篇
  • 书本课后习题 13篇
  • 学习笔记 3篇
  • 网页设计 13篇
  • 数据结构 7篇
  • c++ 42篇
  • 加强练习 1篇
  • java 44篇
  • 练习 9篇

最新评论

  • 最新kaggle注册(不需要翻墙安装插件即可)

    橙子橙子-_: 超级感谢!!!!!!

  • 二叉树知识点最详细最全讲解

    2301_80657385: 引用「有」 右

  • 二叉树知识点最详细最全讲解

    言果: 二叉树定义那有错别字

  • 爬虫实战之华为应用市场

    摆烂的技术人: 有个接口返回这个code,在拼接时间戳组合一下

  • 爬虫实战之华为应用市场

    weixin_52403148: 您好,我也遇到这个问题,请问具体是怎么解决的呀?

大家在看

  • 自定义模板打造专属炫酷的CSDN个人主页!HTML+CSS个性化DIY全攻略 59

最新文章

  • 百分比问题,SQL给你答案(百分比计算)
  • SQL将会员按照总消费金额从高到低分成50档。(分档、分组)
  • SQL查询半年内没有违纪记录,并且期末考试总分为每个班级前10名的学生名单。(日期函数、where、group by)
2022年204篇
2021年29篇
2020年12篇
2019年48篇
2018年133篇
2017年3篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码大芬百度竞价包年推广南联营销型网站建设爱联关键词排名福田外贸网站设计石岩设计公司网站光明网站优化按天计费坪山百度竞价龙岗设计网站吉祥网站关键词优化西乡英文网站建设西乡网站建设坑梓seo网站优化石岩百度网站优化排名惠州SEO按效果付费南联百度seo罗湖网站设计石岩营销型网站建设罗湖优化南澳标王广州关键词按天计费塘坑网站优化按天收费大浪网站定制爱联百度网站优化吉祥设计网站木棉湾百度seo广州设计公司网站大运网站seo优化盐田SEO按天计费广州网页制作东莞百度seo歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化