leecode 数据库:1158. 市场分析 I

数据导入:

SQL Schema:

Create table If Not Exists Users (user_id int, join_date date, favorite_brand varchar(10));
Create table If Not Exists Orders (order_id int, order_date date, item_id int, buyer_id int, seller_id int);
Create table If Not Exists Items (item_id int, item_brand varchar(10));
Truncate table Users;
insert into Users (user_id, join_date, favorite_brand) values ('1', '2018-01-01', 'Lenovo');
insert into Users (user_id, join_date, favorite_brand) values ('2', '2018-02-09', 'Samsung');
insert into Users (user_id, join_date, favorite_brand) values ('3', '2018-01-19', 'LG');
insert into Users (user_id, join_date, favorite_brand) values ('4', '2018-05-21', 'HP');
Truncate table Orders;
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('1', '2019-08-01', '4', '1', '2');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('2', '2018-08-02', '2', '1', '3');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('3', '2019-08-03', '3', '2', '3');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('4', '2018-08-04', '1', '4', '2');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('5', '2018-08-04', '1', '3', '4');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('6', '2019-08-05', '2', '2', '4');
Truncate table Items;
insert into Items (item_id, item_brand) values ('1', 'Samsung');
insert into Items (item_id, item_brand) values ('2', 'Lenovo');
insert into Items (item_id, item_brand) values ('3', 'LG');
insert into Items (item_id, item_brand) values ('4', 'HP');

Pandas Schema:

data = [[1, '2018-01-01', 'Lenovo'], [2, '2018-02-09', 'Samsung'], [3, '2018-01-19', 'LG'], [4, '2018-05-21', 'HP']]
Users = pd.DataFrame(data, columns=['user_id', 'join_date', 'favorite_brand']).astype({'user_id':'Int64', 'join_date':'datetime64[ns]', 'favorite_brand':'object'})
data = [[1, '2019-08-01', 4, 1, 2], [2, '2018-08-02', 2, 1, 3], [3, '2019-08-03', 3, 2, 3], [4, '2018-08-04', 1, 4, 2], [5, '2018-08-04', 1, 3, 4], [6, '2019-08-05', 2, 2, 4]]
Orders = pd.DataFrame(data, columns=['order_id', 'order_date', 'item_id', 'buyer_id', 'seller_id']).astype({'order_id':'Int64', 'order_date':'datetime64[ns]', 'item_id':'Int64', 'buyer_id':'Int64', 'seller_id':'Int64'})
data = [[1, 'Samsung'], [2, 'Lenovo'], [3, 'LG'], [4, 'HP']]
Items = pd.DataFrame(data, columns=['item_id', 'item_brand']).astype({'item_id':'Int64', 'item_brand':'object'})

表结构:

表: Users

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| join_date      | date    |
| favorite_brand | varchar |
+----------------+---------+

        user_id 是此表主键(具有唯一值的列)。
        表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。

表: Orders

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| order_id      | int     |
| order_date    | date    |
| item_id       | int     |
| buyer_id      | int     |
| seller_id     | int     |
+---------------+---------+

        order_id 是此表主键(具有唯一值的列)。
        item_id 是 Items 表的外键(reference 列)。
        (buyer_id,seller_id)是 User 表的外键。

表:Items

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| item_id       | int     |
| item_brand    | varchar |
+---------------+---------+

        item_id 是此表的主键(具有唯一值的列)。

编写解决方案找出每个用户的注册日期和在 2019 年作为买家的订单总数。

以 任意顺序 返回结果表。

查询结果格式如下。

示例 1:

输入:
Users 表:
+---------+------------+----------------+
| user_id | join_date  | favorite_brand |
+---------+------------+----------------+
| 1       | 2018-01-01 | Lenovo         |
| 2       | 2018-02-09 | Samsung        |
| 3       | 2018-01-19 | LG             |
| 4       | 2018-05-21 | HP             |
+---------+------------+----------------+
Orders 表:
+----------+------------+---------+----------+-----------+
| order_id | order_date | item_id | buyer_id | seller_id |
+----------+------------+---------+----------+-----------+
| 1        | 2019-08-01 | 4       | 1        | 2         |
| 2        | 2018-08-02 | 2       | 1        | 3         |
| 3        | 2019-08-03 | 3       | 2        | 3         |
| 4        | 2018-08-04 | 1       | 4        | 2         |
| 5        | 2018-08-04 | 1       | 3        | 4         |
| 6        | 2019-08-05 | 2       | 2        | 4         |
+----------+------------+---------+----------+-----------+
Items 表:
+---------+------------+
| item_id | item_brand |
+---------+------------+
| 1       | Samsung    |
| 2       | Lenovo     |
| 3       | LG         |
| 4       | HP         |
+---------+------------+
输出:
+-----------+------------+----------------+
| buyer_id  | join_date  | orders_in_2019 |
+-----------+------------+----------------+
| 1         | 2018-01-01 | 1              |
| 2         | 2018-02-09 | 2              |
| 3         | 2018-01-19 | 0              |
| 4         | 2018-05-21 | 0              |
+-----------+------------+----------------+

预备知识

        本题使用到的 MySQL 函数的说明:

ifnull(x1, x2) :如果 x1 为 NULL, 返回 x2,否则返回 x1。

方法一:left join 和 group by

思路

        首先根据 Orders 表计算每个用户的订单数,通过 buyer_id 和 Users 表的 user_id 将两份数据结合,找到所有用户的注册时间和订单的数量。

        注意:用户订单的数量可能会 0,需要使用 ifnull 函数特殊处理这种数据。

算法

        使用 Orders 表计算每个用户的产品数。使用 group by 聚合每个用户的购买记录。使用 between 筛选出时间为 2019 年的数据。使用 count(order_id) 计算出每个用户的订单数。

Mysql
select buyer_id, count(order_id) cnt 
from Orders
where order_date between '2019-01-01' and '2019-12-31'
group by buyer_id


        使用 Users 表得到所有用户及其注册时间。并使用 left join,通过 user_id 和第一步的数据连接,求每个用户的订单数。 如果一个用户没有任何订单,那么第一步的数据中不会有这个用户的数据,最后的 orders_in_2019 会显示为 null,所以我们还需要使用 ifnull,如果数据为 null,将其改为 0。
 

Mysql代码

select Users.user_id as buyer_id, join_date, ifnull(UserBuy.cnt, 0) as orders_in_2019
from Users
left join (select buyer_id, count(order_id) cnt from Orderswhere order_date between '2019-01-01' and '2019-12-31'group by buyer_id
) UserBuy
on Users.user_id = UserBuy.buyer_id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模:主成分分析法

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 主成分分析法 算法流程 构建原始数据矩阵 X X X ,其中矩阵的形状为 x ∗ n x * n x∗n ,有 m m m 个对象, n n n 个评价指标。然后进行矩阵的归一化处理。首先计算矩…

vue3 组合式api中 ref 和$parent 的使用

ref 的使用 vue3中, 在 组件中添加一个 component ref“xxx” ,就可以在父组件中得到 子组件的 dom 对象, 以及 虚拟的 dom 对象, 有了虚拟 dom, 我们就可以在父组件中控制子组件的显示了 ref 的使用方法 vue3中ref 的特点 以上…

给设计团队管理者的6个建议优漫动游

即使以前从未担任过领导职务,作为一名设计师,你也已经习惯了仔细地考虑用户体验,这一技能在你领导团队时也会很有用。你需要设计一个环境和结构来使你的成员们完成最好的工作,让公司和用户都能受益。一本名为《DesignLeadershipHa…

删除、移动、复制文件时总是要卡在99%一段时间解决方法

Win10文件夹重命名、移动、删除等操作卡顿3-5秒。 原因分析: 查看发现,卡顿期间资源管理器无响应,并且其高度占用CPU资源,但是对于非文件夹文件操作没有问题。 解决方案: 1、双击“此电脑”,选择“查看”,再选择“选…

DockerCompose常用命令

DockerCompose常用命令 在上一篇博客中,我们对DockerCompose有了一个初步的认识,以及介绍了多种安装方式,本文继续介绍DockerCompose的常用命令。 DockerCompose中常常用到两个术语,一个是服务,一个是项目。服务常常代…

Redis面试题大全含答案

1.什么是Redis? 答:Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value&…

三、mycat分库分表

第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了&…

常静相伴:深度解析C++中的const与static关键字

个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!&#x1f9…

时间切片

1. 下次绘制交互 (INP) 下次绘制交互 (INP) 是一项新的指标,浏览器计划于 2024 年 3 月将其取代取代首次输入延迟 (FID) ,成为最新的 Web Core Vitals(Web 核心性能指标)。 2. 时间切片-scheduler.yield 背景:用户任务完成自动释放控制权给主…

打怪(easy)

B-打怪(easy)_第二十届同济大学程序设计竞赛(同步赛) (nowcoder.com) 问题描述:初始攻击是1,防御是0,血量无穷。怪物防御力永远为0,只有初始血量和攻击力。双方每次受到的攻击会掉对手攻击-自己防御的血量…

[golang 流媒体在线直播系统] 1.直播的简单介绍以及借助腾讯云直播实现在线直播

一.直播的简单介绍 1.介绍 直播,应该不陌生,有电视直播、网络主播、游戏直播、体育直播、在线教育直播等等,那么要实现在线直播的话就 必须要有 “ 流媒体在线直播服务器 ”. “流媒体在线直播服务器 ”不仅可以 实现游戏、赛事、电商、媒体、教育等行业的直播, 还可以实现 …

java八股文面试[多线程]——并发三大特性 原子 可见 顺序

AutomicInteger : volatile CAS 总线LOCK MESI 两个协议 TODO volatile的可见性和禁止重排序是怎么实现的: DCL场景: new操作会在字节码层面生成两个步骤: 分配内存、调用构造器 然后把引用赋值给singleton 不加volatile则会发生指令重…

Docker从认识到实践再到底层原理(二-2)|Namespace+cgroups

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

ssm+vue乐购游戏商城系统源码和论文

ssmvue乐购游戏商城系统源码和论文115 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 随着社会的发展,游戏品种越来越多,计算机的优势和普及使得乐购游戏商城系统的开发成为必需…

mysql 表备份 遇到的问题 【全网最全】

目录 省流: 正文: 1、报错 2、原因 3、解决方法 方法一:关闭 ENFORCE_GTID_CONSISTENCY (不推荐): 方法二(推荐): 4、开启关闭GTID 省流: 不推荐如…

Databricks 入门之sql(二)常用函数

1.类型转换函数 使用CAST函数转换数据类型(可以起别名) SELECTrating,CAST(timeRecorded as timestamp) FROMmovieRatings; 支持的数据类型有: BIGINT、BINARY、BOOLEAN、DATE 、DECIMAL(p,s)、 DOUBLE、 FLOAT、 INT、 INTERVAL interva…

SpringBatch简述

前言 ​ 如今微服务架构应用增多,但在企业里还存在海量数据的批处理场景。诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理。而常见处理方案有: 1、数据脚本跑批 2、批处理框架 3、多线程事务处理方案。 ​ 在满足基本功能之外…

自智网络简介

网络随着业务和流量的发展,已经变的无比复杂,很难通过人力管理,因此业界提出了自智网络(自动驾驶网络)的概念。普林斯顿大学的Nick Feamster和Jennifer Rexford在本文中探讨了为什么网络需要自动化,以及达成这一目标的路径。原文:…

自制centos7.9的wsl发行版

自制centos7.9的wsl发行版 参考:https://zhuanlan.zhihu.com/p/482538727 Windows10提供了一个wsl工具用于直接在windows上运行Linux子系统。 CentOS国内镜像下载:https://mirrors.aliyun.com/centos/ 这里选择了7.9.2009版本:https://mirr…

android studio git没有显示Local Changes界面

设置android studio git没有显示Local Changes界面 Setting -> Version Control-> commit -> 把use non-modal commit interface 的勾勾去掉,如下图所示 然后点击apply,回到git界面就看到了,亲测有效