当前位置: 首页 > news >正文

[每日一练]销售分析(通过数据的0/1转换进行是否存在的查询)

#该题目来源于力扣:

1083. 销售分析 II - 力扣(LeetCode)

题目要求:

表:Product+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| product_id   | int     |
| product_name | varchar |
| unit_price   | int     |
+--------------+---------+
Product_id 是该表的主键(具有唯一值的列)。
该表的每一行表示每种产品的名称和价格。
表:Sales+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| seller_id   | int     |
| product_id  | int     |
| buyer_id    | int     |
| sale_date   | date    |
| quantity    | int     |
| price       | int     |
+------ ------+---------+
这个表可能有重复的行。
product_id 是 Product 表的外键(reference 列)。
buyer_id 永远不会是 NULL。
sale_date 永远不会是 NULL。
该表的每一行都包含一次销售的一些信息。编写一个解决方案,报告那些买了 S8 而没有买 iPhone 的 买家。注意,S8 和 iPhone 是 Product 表中显示的产品。以 任意顺序 返回结果表。结果格式如下所示。示例 1:输入:
Product table:
+------------+--------------+------------+
| product_id | product_name | unit_price |
+------------+--------------+------------+
| 1          | S8           | 1000       |
| 2          | G4           | 800        |
| 3          | iPhone       | 1400       |
+------------+--------------+------------+
Sales table:
+-----------+------------+----------+------------+----------+-------+
| seller_id | product_id | buyer_id | sale_date  | quantity | price |
+-----------+------------+----------+------------+----------+-------+
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   |
| 2         | 1          | 3        | 2019-06-02 | 1        | 800   |
| 3         | 3          | 3        | 2019-05-13 | 2        | 2800  |
+-----------+------------+----------+------------+----------+-------+
输出:
+-------------+
| buyer_id    |
+-------------+
| 1           |
+-------------+
解释:
id 为 1 的买家购买了一部 S8,但是却没有购买 iPhone,而 id 为 3 的买家却同时购买了这 2 部手机。

思路流程:

思维混乱,不如先看看将两个表合并后的数据:

# Write your MySQL query statement below
SELECT *#S.seller_id 
FROM Sales S join Product P on S.product_id = P.product_id| seller_id | product_id | buyer_id | sale_date  | quantity | price | product_id | product_name | unit_price |
| --------- | ---------- | -------- | ---------- | -------- | ----- | ---------- | ------------ | ---------- |
| 1         | 1          | 1        | 2019-01-21 | 2        | 2000  | 1          | S8           | 1000       |
| 1         | 2          | 2        | 2019-02-17 | 1        | 800   | 2          | G4           | 800        |
| 2         | 1          | 3        | 2019-06-02 | 1        | 800   | 1          | S8           | 1000       |
| 3         | 3          | 3        | 2019-05-13 | 2        | 2800  | 3          | iPhone       | 1400       |

可以统计每一个买家购买的商品情况,把购买的商品名字进行0,1转换,建立所有关于商品名字的列,如果用户购买过,返回1,否则返回0.大概思路为:

CASE WHEN product_name = '指定的商品' THEN 1 ELSE F END 自定义列名

由于MySQL分组聚合的特性:如果在 GROUP BY 中不使用聚合函数(如 SUMCOUNTAVG 等),那么 SQL 处理分组时就无法确定应该返回哪个值。标准 SQL 要求在 GROUP BY 的结果集中,除了分组列外,其他列必须用聚合函数处理。我们使用子查询实现:

# Write your MySQL query statement below
select *
from (select buyer_id,
case when product_name='S8' THEN 1 ELSE 0 end T,
case when product_name='iPhone' THEN 1 ELSE 0 END F
FROM Product P RIGHT JOIN Sales S ON P.product_id = S.product_id) A

可见成功的将商品购买数据转化为0/1形式:

| buyer_id | T | F |
————————————————————
| 1        | 1 | 0 |
| 2        | 0 | 0 |
| 3        | 1 | 0 |
| 3        | 0 | 1 |

最后进行分组聚合,按照buyer_id分组,在having条件字段里聚合T和F,条件为T(S8)的累加值>0,说明该客户至少买了一次以上的S8,F(iPhone)的累加值=0,说明该客户一次iPhone都没买过:

# Write your MySQL query statement below
select *
from (select buyer_id,
case when product_name='S8' THEN 1 ELSE 0 end T,
case when product_name='iPhone' THEN 1 ELSE 0 END F
FROM Product P RIGHT JOIN Sales S ON P.product_id = S.product_id) A
GROUP BY buyer_id 
HAVING SUM(T)>0 AND SUM(F)=0

0/1数据转化可以帮助在清洗数据的时候更好的辨别某些分类数据是否存在,极大的便利了后续的分析工作

http://www.lryc.cn/news/474275.html

相关文章:

  • .NET Core WebApi第7讲:项目的发布与部署
  • 【python 将数据写入csv文件】正确方式
  • OpenCV4.8 开发实战系列专栏之 10 - 像素值统计
  • pandas计算相关性并画热力图
  • 初始Docker
  • Redis-概念、安装、基本配置
  • qt QPlainTextEdit详解
  • 【机器学习】23. 聚类-GMM: Gaussian Mixture Model
  • 深度探索C++对象模型
  • 电脑怎么设置开机密码:保障个人信息安全的第一步
  • MybatisPlus入门(六)MybatisPlus-null值处理
  • 红帽认证有必要考吗?这四大人群推荐考取!
  • 基于SSM+微信小程序的社团登录管理系统(社团1)
  • html中cookie如何存储
  • C++基础三(构造函数,形参默认值,函数重载,单例模式,析构函数,内联函数,拷贝构造函数)
  • Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域
  • 如何使用VBA识别Excel中的“单元格中的图片”(2/2)
  • 2024系统架构师---下午题目常考概念
  • 【Linux】从零开始认识五种IO模型 --- 理解五种IO模型,开始使用非阻塞IO
  • Spring Boot 集成阿里云直播点播
  • 舍伍德业务安全架构(Sherwood Applied Business Security Architecture, SABSA)
  • 论可以对抗ai编程的软件开发平台(直接把软件需求描述变成软件的抗ai开发平台)的设计
  • 饿了么数据库表设计
  • Flink处理乱序的数据的最佳实践
  • Android OpenGL ES详解——模板Stencil
  • vscode在cmake config中不知道怎么选一个工具包?select a kit
  • 无人机之无线电监测设备技术篇
  • 【系统架构设计师】预测试卷一:案例分析
  • 一篇文章教会你I2C通信(软件I2C和硬件I2C)以读取MPU6050为例,附STM32代码示例
  • Python实现SPFA算法