如何为分组内最大LevelID的行设置MaxLevel标识列?
如何为分组的最大编号行设置标识?
嘿,这个需求用窗口函数就能完美解决!我看了你提供的原查询和期望结果,核心就是要给每个WorkTypeId+WorktypeWorkID的分组标记出LevelID最大的行,下面直接上修改后的SQL:
SELECT WorkTypeId, WorktypeWorkID, LevelID, CASE WHEN LevelID = MAX(LevelID) OVER (PARTITION BY WorkTypeId, WorktypeWorkID) THEN 1 ELSE 0 END AS MaxLevel FROM Worktypes as w LEFT JOIN WorktypesWorks as ww on w.ID = ww.WorktypeID LEFT JOIN WorktypesWorksLevels as wwl on ww.ID = wwl.WorktypeWorkID
关键逻辑解释:
- 窗口函数分组计算最大值:
MAX(LevelID) OVER (PARTITION BY WorkTypeId, WorktypeWorkID)会针对每一行,计算它所属的WorkTypeId和WorktypeWorkID分组里的最大LevelID值,这个值会和当前行的其他字段一起返回。 - CASE判断标记:用
CASE语句对比当前行的LevelID和分组内的最大值,如果相等就返回1(表示是该分组的最大Level行),否则返回0。 - 自动处理NULL行:对于那些
WorkTypeId、WorktypeWorkID、LevelID全为NULL的行,MAX(LevelID)计算结果也是NULL,而SQL中NULL = NULL的判断结果是未知(UNKNOWN),所以会走到ELSE分支返回0,正好符合你的期望结果。
执行这个查询后,就能得到你想要的带MaxLevel列的结果,完全匹配你给出的期望输出哦!
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

