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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:07:55