❤️博客主页: 楚生辉
❤️系列专栏:【LeetCode刷题】
❤️一句短话: 坚持不懈,孜孜不倦

1.题目描述

表:Customers

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| customer_id   | int     |
| name          | varchar |
+---------------+---------+
customer_id 是该表主键
该表包含所有顾客的信息

表:Orders

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| order_id      | int     |
| order_date    | date    |
| customer_id   | int     |
| product_id    | int     |
+---------------+---------+
order_id 是该表主键
该表包含顾客 customer_id 的订单信息
没有顾客会在一天内订购相同的商品 多于一次

表:Products

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| product_id    | int     |
| product_name  | varchar |
| price         | int     |
+---------------+---------+
product_id 是该表主键
该表包含了所有商品的信息

写一个 SQL 语句,找到每一个顾客最经常订购的商品。

结果表单应该有每一位至少下过一次单的顾客 customer_id , 他最经常订购的商品的 product_idproduct_name

返回结果没有顺序要求。

查询结果格式如下例所示。

示例 1

输入:
Customers表:
+-------------+-------+
| customer_id | name  |
+-------------+-------+
| 1           | Alice |
| 2           | Bob   |
| 3           | Tom   |
| 4           | Jerry |
| 5           | John  |
+-------------+-------+
Orders表:
+----------+------------+-------------+------------+
| order_id | order_date | customer_id | product_id |
+----------+------------+-------------+------------+
| 1        | 2020-07-31 | 1           | 1          |
| 2        | 2020-07-30 | 2           | 2          |
| 3        | 2020-08-29 | 3           | 3          |
| 4        | 2020-07-29 | 4           | 1          |
| 5        | 2020-06-10 | 1           | 2          |
| 6        | 2020-08-01 | 2           | 1          |
| 7        | 2020-08-01 | 3           | 3          |
| 8        | 2020-08-03 | 1           | 2          |
| 9        | 2020-08-07 | 2           | 3          |
| 10       | 2020-07-15 | 1           | 2          |
+----------+------------+-------------+------------+
Products表:
+------------+--------------+-------+
| product_id | product_name | price |
+------------+--------------+-------+
| 1          | keyboard     | 120   |
| 2          | mouse        | 80    |
| 3          | screen       | 600   |
| 4          | hard disk    | 450   |
+------------+--------------+-------+
输出:
+-------------+------------+--------------+
| customer_id | product_id | product_name |
+-------------+------------+--------------+
| 1           | 2          | mouse        |
| 2           | 1          | keyboard     |
| 2           | 2          | mouse        |
| 2           | 3          | screen       |
| 3           | 3          | screen       |
| 4           | 1          | keyboard     |
+-------------+------------+--------------+
解释:
Alice (customer 1) 三次订购鼠标, 一次订购键盘, 所以鼠标是 Alice 最经常订购的商品.
Bob (customer 2) 一次订购键盘, 一次订购鼠标, 一次订购显示器, 所以这些都是 Bob 最经常订购的商品.
Tom (customer 3) 只两次订购显示器, 所以显示器是 Tom 最经常订购的商品.
Jerry (customer 4) 只一次订购键盘, 所以键盘是 Jerry 最经常订购的商品.
John (customer 5) 没有订购过商品, 所以我们并没有把 John 包含在结果表中.

2.代码实现

  • 使用多次连接
SELECTcustomer_id,a.product_id,b.product_name
FROM( SELECT customer_id, product_id, count( product_id ) ct FROM orders GROUP BY customer_id, product_id ) a,products b
WHEREa.product_id = b.product_id AND ( customer_id, ct ) IN (SELECT customer_id,max( ct ) FROM( SELECT customer_id, count( product_id ) ct FROM orders GROUP BY customer_id, product_id ) tmp GROUP BY customer_id)
  • 使用窗口函数

利用窗口函数对每一名客户和对应的订单数量进行排名,最后取第一名

select customer_id, a.product_id, product_name from
(selectcustomer_id,product_id,rank() over(partition by customer_id order by count(product_id) desc)r
from orders
group by customer_id, product_id
) a
join products b on a.product_id = b.product_id
where r = 1
  • 使用With as提高性能

所谓的With as就是可以将一些重复使用到的SQL语句放到with as里面,取一个别名,后面的查询就可以直接使用,这样对于大批量的SQL语句就会起到一个优化的作用

with  a as
(selectcustomer_id,product_id,rank() over(partition by customer_id order by count(product_id) desc)r
from orders
group by customer_id, product_id
)
select customer_id, a.product_id, product_name from a
join products b on a.product_id = b.product_id
where r = 1

【LC中等】1596. 每位顾客最经常订购的商品相关推荐

  1. 某商场为了促销,采用了打折的优惠活动。每位顾客一次购物达到500元以上,给予95%的优惠;达到1000元以上,给予90%的优惠;结果保留两位小数。

    //郑州轻工业大学 //题号:实验一 第三题 //题目: 某商场为了促销,采用了打折的优惠活动.每位顾客一次购物达到500元以上,给予95%的优惠:达到1000元以上,给予90%的优惠:达到1500元 ...

  2. 【等价类划分法】某商店的货品价格(P)都不大于 20 元(且为整数),假设顾客每次付款为 20 元且每次限购一件商品,现有一个软件能在每位顾客购物后给出找零钱的最佳组合(找给顾客货币张数最少)。

    题目: [说明] 某商店的货品价格(P)都不大于 20 元(且为整数),假设顾客每次付款为 20 元且每次限购一件商品,现有一个软件能在每位顾客购物后给出找零钱的最佳组合(找给顾客货币张数最少). 假 ...

  3. 【LC中等】1321. 餐馆营业额变化增长

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 表: Customer +---------------+---------+ | C ...

  4. 【LC中等】1867. 最大数量高于平均水平的订单

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 OrdersDetails 表 +-------------+------+ | Co ...

  5. 【LC中等】1709. 访问日期之间最大的空档期

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 表: UserVisits +-------------+------+ | Colu ...

  6. 【LC中等】1164. 指定日期的产品价格代码优化

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 产品数据表: Products +---------------+---------+ ...

  7. 【LC中等】177. 第N高的薪水

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 表: Employee +-------------+------+ | Column ...

  8. 【LC中等】1949. 坚定的友谊

    ❤️博客主页: 楚生辉 ❤️系列专栏:[LeetCode刷题] ❤️一句短话: 坚持不懈,孜孜不倦 1.题目描述 表名: Friendship +-------------+------+ | 列名 ...

  9. 【数据库系统】数据库系统学习与实践系列文章汇总目录(持续更新中)

    本文属于「数据库系统」系列文章的汇总目录,这一系列着重于「数据库系统知识的学习与实践」.由于文章内容随时可能发生更新变动,欢迎关注和收藏本文以作备忘.需要特别说明的是,为了透彻理解和全面掌握数据库系统 ...

最新文章

  1. sku属性组合小例子
  2. 三句话回答C/C++面试题
  3. Android LocalBroadcastManager 的使用总结
  4. 中国科学家突破二氧化碳人工合成淀粉技术
  5. DelayedFetch分析
  6. 华为年度旗舰Mate 30 Pro真机现身,既惊喜又失望...
  7. cnblogs今天开通了!
  8. c语言程序设计 简述操作系统管理文件的方法,C语言程序设计基础实验.doc
  9. 学python要多久-目前Python学习需要多长时间?老男孩Python入门培训
  10. UVa 1585 - Score
  11. 第三次握手为什么没有序列号_TCP三次握手机制-深入浅出(实例演示)
  12. 华为手机bootloader上锁回锁教程及ADB工具下载——精华帖
  13. u盘复制一直正在计算机,解决U盘复制文件时电脑总是重启的方法
  14. #边学边记 新一代信息技术
  15. linux怎么找宝塔地址,宝塔Linux面板安全入口地址忘了(方法一)
  16. TreeView的用法
  17. Oracle-SQLLDR加载TPC-DS数据
  18. webStrom2018 版 下载 安装,license server破解 IntelliJ IDEA
  19. 线性代数——基变换和图像压缩
  20. PS人物头发抠取教程 PS照片换背景方法

热门文章

  1. 如何找到Mysql安装的bin目录/如何启动Mysql8
  2. 牛客网sql题详解41-50
  3. 【GIS - 地理信息系统】WGS 84 坐标系和 GCJ-02 坐标加密偏移 ( 大地坐标系 和 加密坐标系 | WGS 84 坐标体系简介 | GCJ-02 坐标加密偏移 )
  4. BIGDATA-redis
  5. hctf2016 web 部分WriteUp.md
  6. SSM框架视频资源免费分享
  7. 数据结构与算法-数组篇
  8. go time.Parse的一些小知识
  9. 互联网技术架构——有备无患
  10. 微信小程序入门资料,学习资料汇总