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

SQL按Cust_ID筛选首次出现Yes及后续行(有后续行时)

按客户筛选首次出现"Yes"后包含后续行的数据

需求说明

针对每个Cust_ID,遍历Indicator字段找到首次出现"Yes"的行,仅当该行之后存在其他行时,保留该行及之后的所有行。

原始数据

Cust_IDIndicatorOrder
1No1
1Yes2
1Yes3
2Yes1
3No1
3No2
3Yes3
3No4

预期输出

Cust_IDIndicatorOrder
1Yes2
1Yes3
3Yes3
3No4

简便实现方法

方法1:SQL(适合数据库操作)

通过预计算每个客户的关键指标,再筛选符合条件的行:

WITH customer_metrics AS (
    SELECT
        Cust_ID,
        -- 提取每个客户首次出现"Yes"对应的Order值
        MIN(CASE WHEN Indicator = 'Yes' THEN "Order" END) AS first_yes_order,
        -- 获取每个客户的最大Order值,用于判断是否有后续行
        MAX("Order") AS max_order
    FROM your_table
    GROUP BY Cust_ID
)
SELECT t.*
FROM your_table t
JOIN customer_metrics cm ON t.Cust_ID = cm.Cust_ID
-- 筛选首次Yes之后的行,且确保首次Yes不是该客户的最后一行
WHERE t."Order" >= cm.first_yes_order
  AND cm.first_yes_order < cm.max_order
ORDER BY t.Cust_ID, t."Order";

方法2:Python Pandas(适合数据处理脚本)

通过分组自定义逻辑快速筛选:

import pandas as pd

# 构建原始数据集
df = pd.DataFrame({
    'Cust_ID': [1,1,1,2,3,3,3,3],
    'Indicator': ['No','Yes','Yes','Yes','No','No','Yes','No'],
    'Order': [1,2,3,1,1,2,3,4]
})

# 定义分组筛选规则
def filter_group_rows(group):
    # 找到组内第一个"Yes"的位置索引
    first_yes_idx = group[group['Indicator'] == 'Yes'].index.min()
    # 存在Yes且该位置不是组内最后一行时,返回后续所有行
    if pd.notna(first_yes_idx) and first_yes_idx < group.index.max():
        return group.loc[first_yes_idx:]
    return pd.DataFrame()

# 分组应用筛选并输出结果
result = df.groupby('Cust_ID', group_keys=False).apply(filter_group_rows)
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 13:58:10