【SQL / Pandas思考记录】力扣607. 销售员

原题链接


SQL与Pandas代码分析与比较

本文旨在详细分析并比较在处理数据库查询问题时SQL代码与Pandas代码的差异。我们将以一个具体的算法题为例,探讨如何在SQL和Pandas中实现相同的功能,并分析将SQL查询转换为Pandas操作的思考过程。

问题描述

本例涉及到的问题是:找出没有与特定公司(此例中为"RED"公司)相关订单的所有销售人员的姓名。

SQL代码解析

SQL代码1

SELECT 
    name
FROM
    SalesPerson
WHERE
    SalesPerson.sales_id
    NOT IN (
        SELECT 
            sales_id
        FROM
            Orders
        WHERE
            Orders.com_id = (
                SELECT
                    com_id
                FROM
                    Company
                WHERE 
                    Company.name = 'RED'               
            )
    )

此SQL查询的目的是从SalesPerson表中选择没有向“RED”公司销售过的销售人员的姓名。它的做法较为简单粗暴,通过一个嵌套的子查询来实现,首先在内部子查询中找出与“RED”公司相关的所有订单,然后在外部查询中选择那些不在这些订单中的销售人员。

SQL代码2

SELECT 
    name
FROM
    SalesPerson
WHERE
    SalesPerson.sales_id NOT IN (
        SELECT 
            sales_id
        FROM
            Orders LEFT JOIN Company ON Company.com_id = Orders.com_id
        WHERE
            Company.name = 'RED'    
    )

这个查询与第一个查询相似,但使用了左连接(LEFT JOIN)来关联OrdersCompany表,性能更优。这个查询的逻辑是先找出所有与“RED”公司有关的订单,然后选择那些不在这些订单中的销售人员。

Pandas代码解析

import pandas as pd

def sales_person(sales_person: pd.DataFrame, company: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
    df = pd.merge(orders, company, on='com_id')
    fil = df[df['name'] == 'RED']
    invalid_ids = fil.sales_id.unique()
    valid_sales = sales_person[~sales_person['sales_id'].isin(invalid_ids)]

    return valid_sales[['name']]

在SQL代码2的Pandas实现中,首先通过pd.mergeorderscompany表连接,然后筛选出与“RED”公司相关的订单。接着从这些订单中提取销售人员的ID,并在sales_person表中选择那些不在这些ID中的销售人员。

SQL转Pandas思考步骤

  1. 数据关联:SQL中的JOIN操作在Pandas中通过mergejoin函数实现。
  2. 子查询转换:SQL中的子查询在Pandas中通常转换为一系列步骤,包括筛选操作和数据集的切片。
  3. 集合操作:SQL中的IN和NOT IN操作在Pandas中可以通过isin方法以及布尔索引实现。

在转换SQL到Pandas时,重要的是理解SQL查询的逻辑并将其分解成Pandas可以执行的步骤。在这个例子中,关键是理解如何关联不同的数据表并对数据进行适当的筛选和提取。

SQL代码执行步骤

  1. FROM从指定的数据表中开始。
  2. JOIN完成数据表之间的连接操作。
  3. WHERE根据条件筛选数据。
  4. SELECT返回数据。

希望这篇分析能够清晰地展示SQL与Pandas在数据处理方面的异同,并帮助读者更好地理解如何将SQL查询转换为Pandas操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值