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

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计算字段实现

按以下步骤操作即可:

  1. 先处理日期字段:创建计算字段命名为转换后日期,公式为 DATEPARSE('dd.MM.yyyy', [event_date]),也可以直接右键event_date字段手动修改数据类型为日期格式
  2. 创建检查用的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
  1. 最后将id和检查结果字段拖到画布中,去重后即可得到目标输出。

内容的提问来源于stack exchange,提问作者Romero Azzalini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:54:03