SQL按Cust_ID筛选首次出现Yes及后续行(有后续行时)
按客户筛选首次出现"Yes"后包含后续行的数据
需求说明
针对每个Cust_ID,遍历Indicator字段找到首次出现"Yes"的行,仅当该行之后存在其他行时,保留该行及之后的所有行。
原始数据
| Cust_ID | Indicator | Order |
|---|---|---|
| 1 | No | 1 |
| 1 | Yes | 2 |
| 1 | Yes | 3 |
| 2 | Yes | 1 |
| 3 | No | 1 |
| 3 | No | 2 |
| 3 | Yes | 3 |
| 3 | No | 4 |
预期输出
| Cust_ID | Indicator | Order |
|---|---|---|
| 1 | Yes | 2 |
| 1 | Yes | 3 |
| 3 | Yes | 3 |
| 3 | No | 4 |
简便实现方法
方法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
相关产品推荐
相关产品推荐

