按Client分组,依据Status优先级分配主状态的技术需求
按Client分组并基于Status优先级分配主状态
需求说明
- 按
Client字段对数据分组 - 为每个分组分配主状态,优先级规则如下:
- 若组内存在
Status 1,则主状态为Status 1(优先级最高) - 若不存在
Status 1但存在Status 2,则主状态为Status 2 - 以此类推,
Status 4为最低优先级
- 若组内存在
示例数据
| Client | Purchase | Status |
|---|---|---|
| Client 1 | Purchase 1 | Status 1 |
| Client 1 | Purchase 2 | Status 2 |
| Client 1 | Purchase 3 | Status 1 |
| Client 2 | Purchase 4 | Status 2 |
| Client 2 | Purchase 5 | Status 3 |
| Client 3 | Purchase 4 | Status 1 |
| Client 3 | Purchase 5 | Status 4 |
期望结果
| Client | Main Status |
|---|---|
| Client 1 | Status 1 |
| Client 2 | Status 2 |
| Client 3 | Status 1 |
实现方案
方案1:Python Pandas
通过提取Status中的数字作为优先级,分组后取每组优先级最高(数字最小)的状态:
import pandas as pd # 构造示例数据 data = { 'Client': ['Client 1', 'Client 1', 'Client 1', 'Client 2', 'Client 2', 'Client 3', 'Client 3'], 'Purchase': ['Purchase 1', 'Purchase 2', 'Purchase 3', 'Purchase 4', 'Purchase 5', 'Purchase 4', 'Purchase 5'], 'Status': ['Status 1', 'Status 2', 'Status 1', 'Status 2', 'Status 3', 'Status 1', 'Status 4'] } df = pd.DataFrame(data) # 提取Status里的数字作为优先级值 df['Priority'] = df['Status'].str.extract('(\d+)').astype(int) # 分组后取每组优先级最小的Status作为主状态 result = df.groupby('Client').apply( lambda group: group.loc[group['Priority'].idxmin(), 'Status'] ).reset_index(name='Main Status') print(result)
运行后输出结果与期望结果完全一致。
方案2:SQL
利用窗口函数按Client分组,对Status的数字排序后取第一条记录:
WITH ranked_status AS ( SELECT Client, Status, -- 提取Status中的数字并排序,数字越小优先级越高 ROW_NUMBER() OVER ( PARTITION BY Client ORDER BY CAST(SUBSTRING(Status, CHARINDEX(' ', Status) + 1) AS INT) ASC ) AS rn FROM your_table_name ) SELECT Client, Status AS "Main Status" FROM ranked_status WHERE rn = 1;
替换your_table_name为实际表名即可执行,返回结果符合需求。
内容的提问来源于stack exchange,提问作者Iryna
相关产品推荐
相关产品推荐

