You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询对比满足特定条件的A、B实体行?

SQL实现方案

用自连接就能实现这种行对比逻辑,直接在数据库层面完成筛选,不用把全量数据拉出来处理。假设你的表名叫your_table,SQL语句如下:

SELECT 
    a.Identifier,
    a.entity_name AS a_entity,
    a.quantity AS a_quantity,
    b.entity_name AS b_entity,
    b.quantity AS b_quantity,
    a.date_1,
    a.date_2
FROM your_table a
JOIN your_table b
    ON a.Identifier = b.Identifier
    AND a.date_1 = b.date_1
    AND a.date_2 = b.date_2
WHERE 
    a.entity_name = 'A'
    AND b.entity_name = 'B'
    AND a.date_1 > CURRENT_DATE()
    AND a.quantity < b.quantity;

逻辑解释

  • 把同一张表用别名a和b拆分,分别对应entity为A和B的行
  • 通过JOIN关联条件确保两者的Identifier、date_1、date_2完全匹配
  • 最后过滤出date_1在当前日期之后,且A的quantity小于B的记录

如果需要同时展示符合条件的A和B原始行,这个查询可以直接返回对应数据。

Pandas实现方案

如果习惯用Python处理,Pandas也能轻松实现,步骤如下:

  1. 先筛选出仅包含A和B的行,过滤date_1大于当前日期的数据
  2. 把数据按Identifier、date_1、date_2分组,确保每组里同时有A和B
  3. 对比两组的quantity值

示例代码:

import pandas as pd
from datetime import datetime

# 假设你的数据已经读到df里
df = pd.read_sql("SELECT * FROM your_table", your_db_connection)

# 第一步:筛选基础条件
filtered_df = df[
    (df['entity_name'].isin(['A', 'B'])) &
    (df['date_1'] > datetime.now().date())
]

# 第二步:转成宽表,把A和B的quantity分别列出来
pivot_df = filtered_df.pivot_table(
    index=['Identifier', 'date_1', 'date_2'],
    columns='entity_name',
    values='quantity',
    aggfunc='first'  # 假设每组A/B只有一条记录
).reset_index()

# 第三步:筛选A的quantity小于B的记录
result = pivot_df[
    (pivot_df['A'].notna()) & 
    (pivot_df['B'].notna()) & 
    (pivot_df['A'] < pivot_df['B'])
]

# 如果需要还原成原始行格式,可以再合并回去
final_result = pd.merge(
    filtered_df,
    result[['Identifier', 'date_1', 'date_2']],
    on=['Identifier', 'date_1', 'date_2']
)
选SQL还是Pandas?
  • 优先用SQL:如果数据量很大(几十万/百万级),直接在数据库处理效率更高,避免把大量数据拉到本地占用内存;而且数据库的查询优化器会自动处理关联逻辑,速度更快。
  • 用Pandas:如果数据量小,或者筛选后还要做后续的可视化、复杂统计分析,Pandas的灵活性更强,能一站式完成数据处理和分析流程。

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:35:13