SQL查询需求:为数据表添加基于用户和周维度的版本最大值标识列
SQL查询需求:为数据表添加基于用户和周维度的版本最大值标识列
嘿,这个需求挺典型的,我给你两种实用的写法,适配不同的数据库环境:
方法一:用窗口函数(推荐,简洁高效)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server、Oracle这些主流版本),这是最省心的写法:
SELECT USER, Week, DAY, VERSION, CASE WHEN VERSION = MAX(VERSION) OVER(PARTITION BY USER, Week) THEN 'Y' ELSE 'N' END AS IS_MAX_VERSION FROM your_table_name; -- 记得替换成你的实际表名
逻辑说明:
PARTITION BY USER, Week会把数据按用户+周分成一个个独立的分组MAX(VERSION) OVER(...)会计算每个分组里的最大版本号- 最后用
CASE语句判断当前行的版本号是否等于组内最大值,是就标Y,否则标N
方法二:子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x这类旧版本),可以用子查询先算出每个用户每周的最大版本,再和原表关联判断:
SELECT t.USER, t.Week, t.DAY, t.VERSION, CASE WHEN t.VERSION = mv.max_version THEN 'Y' ELSE 'N' END AS IS_MAX_VERSION FROM your_table_name t -- 替换成实际表名 JOIN ( -- 子查询:先算出每个用户每周的最大版本 SELECT USER, Week, MAX(VERSION) AS max_version FROM your_table_name -- 同样替换表名 GROUP BY USER, Week ) mv ON t.USER = mv.USER AND t.Week = mv.Week;
逻辑说明:
- 子查询
mv先通过GROUP BY USER, Week算出每个用户+周分组的最大版本 - 原表
t和子查询结果关联,对比每行的版本号是否等于对应分组的最大值,生成标识列
两种方法都能满足你的需求,优先推荐窗口函数的写法,代码更简洁,执行效率也更高哦。
备注:内容来源于stack exchange,提问作者Senthil
相关产品推荐
相关产品推荐

