Dataiku分组聚合需求:按频率选值,频率相同时取最新日期值
解决方案(Dataiku Compute Recipe 自定义SQL聚合优化)
一、简化各值次数统计(消除冗余CASE)
直接用条件聚合实现,无需重复编写冗余分支,在Dataiku自定义聚合区域添加以下字段:
nb_a:SUM(CASE WHEN Col1 = 'a' THEN 1 ELSE 0 END)nb_b:SUM(CASE WHEN Col1 = 'b' THEN 1 ELSE 0 END)nb_c:SUM(CASE WHEN Col1 = 'c' THEN 1 ELSE 0 END)nb_Null:SUM(CASE WHEN Col1 IS NULL THEN 1 ELSE 0 END)
二、实现greatest列的逻辑(处理频率相同取最新日期)
核心思路是通过窗口函数先计算每个ID下各Col1值的出现频次、对应最新日期,再按「频次降序→日期降序」排序,取优先级最高的映射值。在自定义聚合中添加greatest字段,SQL表达式如下:
FIRST_VALUE( CASE WHEN Col1 = 'a' THEN 'Hi' WHEN Col1 = 'b' THEN 'Hello' WHEN Col1 = 'c' THEN 'Welcome' WHEN Col1 IS NULL THEN 'Unknown' END ) OVER ( PARTITION BY ID ORDER BY SUM(CASE WHEN Col1 = COALESCE(Col1, 'NULL') THEN 1 ELSE 0 END) OVER (PARTITION BY ID, COALESCE(Col1, 'NULL')) DESC, MAX(Date) OVER (PARTITION BY ID, COALESCE(Col1, 'NULL')) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS greatest
逻辑说明:
- 内层窗口函数
SUM(...) OVER (PARTITION BY ID, COALESCE(Col1, 'NULL')):计算每个ID下,Col1各值(含Null)的出现次数 - 内层窗口函数
MAX(Date) OVER (PARTITION BY ID, COALESCE(Col1, 'NULL')):计算每个ID下,Col1各值对应的最新日期 FIRST_VALUE按「频次降序→日期降序」排序后取第一个映射值,完美覆盖「频率相同取最新日期」的规则
三、Dataiku Compute Recipe配置步骤
- 新建Compute Recipe,选择分组模式
- 分组列选择
ID - 在「自定义聚合」标签页,依次添加上述
nb_a、nb_b、nb_c、nb_Null、greatest字段及其对应的SQL表达式 - 运行Recipe即可得到目标数据集
内容的提问来源于stack exchange,提问作者Pierre-Yves Mimpontel
相关产品推荐
相关产品推荐

