求助:在Databricks SQL中基于Category字段生成Group列
Databricks SQL实现按Trans_ID分组生成Group列
你可以通过窗口函数结合条件判断来实现需求,核心是按Trans_ID分组,判断组内是否存在非Dog/Puppy的类别,再给每条记录赋值对应的Group值。以下是两种简洁的实现方式:
方法一:使用CASE嵌套+MAX窗口函数
SELECT Trans_ID, Category, CASE -- 统计当前Trans_ID下是否存在非Dog/Puppy的类别 WHEN MAX(CASE WHEN Category NOT IN ('Dog', 'Puppy') THEN 1 ELSE 0 END) OVER (PARTITION BY Trans_ID) = 1 THEN 'Multi' ELSE 'Only Dog' END AS `Group` FROM filtered_table; -- 替换为你的已过滤表名
逻辑说明:
- 内层
CASE将非Dog/Puppy的类别标记为1,其余标记为0 MAX() OVER (PARTITION BY Trans_ID)获取当前Trans_ID分组内的最大值,若最大值为1,说明组内存在非Dog/Puppy的类别- 外层
CASE根据最大值结果,返回对应的Group值
方法二:使用COUNT_IF窗口函数(更简洁)
Databricks SQL支持COUNT_IF函数,可以直接统计满足条件的行数,写法更直观:
SELECT Trans_ID, Category, CASE -- 统计当前Trans_ID下非Dog/Puppy的类别数量,大于0则返回Multi WHEN COUNT_IF(Category NOT IN ('Dog', 'Puppy')) OVER (PARTITION BY Trans_ID) > 0 THEN 'Multi' ELSE 'Only Dog' END AS `Group` FROM filtered_table; -- 替换为你的已过滤表名
逻辑说明:
COUNT_IF(Category NOT IN ('Dog', 'Puppy')) OVER (PARTITION BY Trans_ID)直接统计当前Trans_ID分组内,非Dog/Puppy的记录数量。若数量大于0,说明组内存在其他类别,返回Multi;否则返回Only Dog。
两种方法都能完美匹配你给出的示例结果,比如Trans_ID=1包含Cat,会被标记为Multi;Trans_ID=2、3仅包含Dog/Puppy,会被标记为Only Dog。
内容的提问来源于stack exchange,提问作者sm98123
相关产品推荐
相关产品推荐

