【SQL / Pandas思考记录】力扣1607.没有卖出的卖家

原题链接


分析与解决1607题:没有卖出的卖家

在这篇博客中,我们将深入探讨LeetCode数据库问题1607,题目为“没有卖出的卖家”。本文将提供一个详尽的解题步骤,包括SQL解决方案及其转化为Pandas代码的过程。此外,我们也会提供详细的注释和解释,以便更好地理解这个问题的解决方案。

题目描述

题目的核心是找出在2020年没有任何销售记录的卖家。我们需要考虑以下三张表:

  • Customer表:包含顾客信息。
  • Orders表:包含所有订单信息,包括交易日期。
  • Seller表:包含卖家信息。

我们的目标是列出2020年没有销售记录的卖家,并按照卖家名称升序排序。

SQL解决方案

首先,让我们看看SQL解决方案:

SELECT 
    seller_name 
FROM
    Orders RIGHT JOIN Seller
ON
    Orders.seller_id = Seller.seller_id AND year(Orders.sale_date) = '2020'
WHERE
     Orders.order_id is NULL
ORDER BY
    seller_name

代码解析

  1. 连接(JOIN)操作:这里使用了RIGHT JOIN操作,以Seller表为基础。这意味着我们会保留Seller表中的所有行,即使它们在Orders表中没有匹配项。

  2. 条件过滤:在连接操作中,我们还筛选出了sale_date为2020年的订单。这是通过year(Orders.sale_date) = '2020'实现的。

  3. 空值检查:在WHERE子句中,我们检查Orders.order_id is NULL。这个条件用于找出那些即便出现在Orders表中也没有任何2020年订单的卖家。

  4. 排序:最后,我们按照seller_name进行升序排序。

Pandas解决方案

接下来,让我们将SQL代码转换为Pandas代码:

import pandas as pd

def sellers_with_no_sales(customer: pd.DataFrame, orders: pd.DataFrame, seller: pd.DataFrame) -> pd.DataFrame:
  # 筛选2020年的订单
  df = orders[orders['sale_date'].dt.year == 2020]
  # 与Seller表进行右连接
  df = df.merge(seller, on='seller_id', how='right')
  # 查找没有订单的卖家
  return df[df['order_id'].isna()][['seller_name']].sort_values(by='seller_name', ascending=True)

代码解析

  1. 数据筛选:首先,我们筛选出2020年的订单。这是通过orders['sale_date'].dt.year == 2020实现的。

  2. 合并(Merge)操作:使用merge函数进行类似SQL中的右连接操作。这里的how='right'参数确保了我们保留了seller表中的所有行。

  3. 空值检查和排序:最后,我们使用isna()方法来找出没有对应订单的卖家,并按照seller_name进行排序。

将SQL代码转化为Pandas代码的思路及SQL代码的执行顺序解析

当我们将SQL查询转换成Pandas代码时,理解SQL的执行顺序是关键。SQL的执行顺序并非与编写顺序一致。这一点对于理解查询逻辑和进行有效的转换至关重要。

SQL代码执行顺序

SQL查询的实际执行顺序通常如下:

  1. FROM和JOIN子句:这是查询的起点,确定要从哪些表获取数据。
  2. WHERE子句:在提取数据后,接下来会基于这些条件过滤数据。
  3. SELECT子句:选择和计算输出列。这是实际看到的列。
  4. ORDER BY子句:最后,对结果进行排序。

在我们的例子中,首先执行的是RIGHT JOIN操作,然后是WHERE子句过滤,接着是SELECT输出所需列,最后是ORDER BY子句对结果排序。

转化为Pandas代码的思路

  1. 处理JOIN操作:在Pandas中,merge函数类似于SQL中的JOIN操作。在我们的例子中,使用how='right'参数模拟RIGHT JOIN

  2. 处理WHERE过滤:在Pandas中,可以使用布尔索引来过滤数据。例如,orders[orders['sale_date'].dt.year == 2020]用于筛选2020年的订单,类似于SQL的WHERE子句。

  3. 处理SELECT操作:在Pandas中,列的选择是通过列名索引完成的。例如,[['seller_name']]选择了seller_name列。

  4. 处理ORDER BY操作:最后,使用sort_values方法进行排序,类似于SQL的ORDER BY子句。

例子中的Pandas代码解析

def sellers_with_no_sales(customer: pd.DataFrame, orders: pd.DataFrame, seller: pd.DataFrame) -> pd.DataFrame:
    # 筛选2020年的订单
    df = orders[orders['sale_date'].dt.year == 2020]
    # 与Seller表进行右连接
    df = df.merge(seller, on='seller_id', how='right')
    # 查找没有订单的卖家
    return df[df['order_id'].isna()][['seller_name']].sort_values(by='seller_name', ascending=True)
  1. 筛选2020年的订单:这对应于SQL中的WHERE子句,用于筛选特定年份的订单。
  2. 右连接:这对应于SQL查询中的FROM和JOIN子句,用于合并Orders和Seller表。
  3. 查找没有订单的卖家:这对应于SQL的SELECT和WHERE子句,用于选择没有2020年订单的卖家。
  4. 排序:这对应于SQL的ORDER BY子句,用于按卖家名称排序。

通过这种方法,我们能够将SQL查询逻辑有效地转换为Pandas代码,同时保持查询的核心逻辑不变。这对于在不同编程环境中处理数据非常有帮助。

结论

通过上述分析,我们不仅展示了如何使用SQL和Pandas解决“没有卖出的卖家”这个问题,而且提供了详细的步骤和注释。这种方法不仅有助于解决当前的问题,而且为处理类似问题提供了一个参考框架。希望这篇博客能帮助读者更好地理解数据库查询和数据处理的相关概念。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值