MySQL中创建IS active布尔列标记重复项(参考Tableau逻辑)
在MySQL中实现类似Tableau FIXED逻辑的IS_active布尔列
核心逻辑说明
对应你在Tableau中使用的FIXED caseid : max(visitdate)=visitdate逻辑,目标是:
- 同一
caseid下,仅最新visitdate的记录标记为TRUE - 同一
caseid下的旧记录标记为FALSE - 单个
caseid仅一条记录时,默认标记为TRUE
方法1:查询时动态计算(MySQL 8.0+ 推荐)
利用窗口函数MAX() OVER (PARTITION BY)直接分组计算每组的最大日期,对比当前行日期即可:
SELECT caseid, visitdate, CASE WHEN visitdate = MAX(visitdate) OVER (PARTITION BY caseid) THEN TRUE ELSE FALSE END AS is_active FROM your_table;
方法2:添加持久化生成列(MySQL 8.0.13+)
如果需要将is_active作为表的固定列持久存储,可使用生成列:
ALTER TABLE your_table ADD COLUMN is_active BOOLEAN GENERATED ALWAYS AS ( CASE WHEN visitdate = (SELECT MAX(visitdate) FROM your_table t WHERE t.caseid = your_table.caseid) THEN TRUE ELSE FALSE END ) STORED;
注:生成列会自动维护,当表中
visitdate或caseid数据变更时,is_active值会同步更新。
方法3:兼容MySQL 5.x版本(无窗口函数)
通过子查询预先计算每组的最大日期,再关联原表对比:
SELECT t1.caseid, t1.visitdate, CASE WHEN t1.visitdate = t2.max_visit THEN TRUE ELSE FALSE END AS is_active FROM your_table t1 INNER JOIN ( SELECT caseid, MAX(visitdate) AS max_visit FROM your_table GROUP BY caseid ) t2 ON t1.caseid = t2.caseid;
内容的提问来源于stack exchange,提问作者Hussain123
相关产品推荐
相关产品推荐

