Spark SQL:如何按rank与num非0条件选取目标colour值?
实现方案
以下提供两种常用工具的实现方式,均能满足你的需求:
1. SQL 实现
通过窗口函数定义优先级并筛选目标行:
WITH ranked_data AS ( SELECT Name, colour, num, rank, -- 设定优先级:rank=1且num≠0为最高优先级,其次是rank2/3且num≠0 CASE WHEN rank = 1 AND num != 0 THEN 1 WHEN rank IN (2,3) AND num != 0 THEN 2 ELSE 3 END AS priority, -- 按分组内优先级、rank升序分配行号 ROW_NUMBER() OVER (PARTITION BY Name ORDER BY priority, rank) AS rn FROM your_table_name ) SELECT Name, colour AS selected_colour FROM ranked_data WHERE rn = 1;
逻辑说明
- 先用CTE为每行计算优先级,确保符合要求的行排在前面;
- 按
Name分组后,给每行分配行号rn,每组中rn=1的就是最终要选的行; - 代入示例数据后,Name A会选中yellow,Name B会选中green,完全匹配需求。
2. Pandas(Python)实现
通过分组自定义函数筛选目标颜色:
import pandas as pd # 示例数据(替换为你的实际数据) data = { 'Name': ['A', 'A', 'B', 'B'], 'colour': ['blue', 'yellow', 'green', 'brown'], 'num': [0, 300, 100, 500], 'rank': [1, 2, 1, 2] } df = pd.DataFrame(data) def select_colour(group): # 优先选择rank=1且num≠0的行 rank1_valid = group[(group['rank'] == 1) & (group['num'] != 0)] if not rank1_valid.empty: return rank1_valid['colour'].iloc[0] # 若rank1无效,选择rank2/3且num≠0的行(按rank升序取第一个) rank23_valid = group[(group['rank'].isin([2,3])) & (group['num'] != 0)].sort_values('rank') if not rank23_valid.empty: return rank23_valid['colour'].iloc[0] # 无符合条件行时返回None(可根据需求调整默认值) return None # 分组应用函数并输出结果 result = df.groupby('Name').apply(select_colour).reset_index(name='selected_colour') print(result)
运行结果
Name selected_colour 0 A yellow 1 B green
内容的提问来源于stack exchange,提问作者user3735871
相关产品推荐
相关产品推荐

