Tableau计算字段或SQL实现按id分组判断事件a日期是否早于事件b
需求实现方案
该需求可以通过SQL和Tableau计算字段两种方式实现,具体方案如下:
SQL实现
核心逻辑为按id分组,分别计算每个id下事件a、事件b的最早日期,再做比较判断,不同数据库的日期转换函数可对应调整,通用参考代码如下:
SELECT id, CASE -- 无事件a的情况按示例规则返回ok,可自行调整 WHEN MIN(CASE WHEN event_name = 'a' THEN STR_TO_DATE(event_date, '%d.%m.%Y') END) IS NULL THEN 'ok' -- 无事件b的情况可自定义规则,此处示例默认返回ok WHEN MIN(CASE WHEN event_name = 'b' THEN STR_TO_DATE(event_date, '%d.%m.%Y') END) IS NULL THEN 'ok' -- 两个事件都存在时比较最早日期 WHEN MIN(CASE WHEN event_name = 'a' THEN STR_TO_DATE(event_date, '%d.%m.%Y') END) < MIN(CASE WHEN event_name = 'b' THEN STR_TO_DATE(event_date, '%d.%m.%Y') END) THEN 'ok' ELSE 'error' END AS `check` FROM 你的表名 GROUP BY id
上述代码运行结果与你给出的示例输出完全一致。
Tableau计算字段实现
按以下步骤操作即可:
- 先处理日期字段:创建计算字段命名为
转换后日期,公式为DATEPARSE('dd.MM.yyyy', [event_date]),也可以直接右键event_date字段手动修改数据类型为日期格式 - 创建检查用的LOD计算字段,命名为
检查结果,2020.2及以上版本可使用带LET语法的简化写法:
// 取当前id下事件a的最早日期 LET @min_a = {FIXED [id]: MIN(IF [event_name] = 'a' THEN [转换后日期] END)} // 取当前id下事件b的最早日期 LET @min_b = {FIXED [id]: MIN(IF [event_name] = 'b' THEN [转换后日期] END)} IF ISNULL(@min_a) THEN 'ok' ELSEIF ISNULL(@min_b) THEN 'ok' ELSEIF @min_a < @min_b THEN 'ok' ELSE 'error' END
低版本Tableau使用嵌套写法即可:
IF ISNULL({FIXED [id]: MIN(IF [event_name] = 'a' THEN [转换后日期] END)}) THEN 'ok' ELSEIF ISNULL({FIXED [id]: MIN(IF [event_name] = 'b' THEN [转换后日期] END)}) THEN 'ok' ELSEIF {FIXED [id]: MIN(IF [event_name] = 'a' THEN [转换后日期] END)} < {FIXED [id]: MIN(IF [event_name] = 'b' THEN [转换后日期] END)} THEN 'ok' ELSE 'error' END
- 最后将id和
检查结果字段拖到画布中,去重后即可得到目标输出。
内容的提问来源于stack exchange,提问作者Romero Azzalini
相关产品推荐
相关产品推荐

