按USERID获取SEQNBR最大值并排除含STATUS='CLE'的用户(禁用CTE及SELECT子查询)
解决你的SQL分组过滤问题
嘿,针对你的需求——按USERID分组取SEQNBR最大值,同时排除所有存在STATUS='CLE'记录的用户,而且不能用CTE和SELECT子查询,我给你两个实用的方案:
方案一:简洁的GROUP BY + HAVING(仅需USERID和最大值)
这是最直接的写法,用HAVING子句过滤掉包含STATUS='CLE'的用户分组,同时计算最大值:
SELECT A.USERID, MAX(CONVERT(CHAR(10), A.SEQNBR, 120)) AS MAX_SEQNBR -- 保留你原有的CONVERT格式,按需调整参数 FROM 你的表名 A GROUP BY A.USERID HAVING COUNT(CASE WHEN A.STATUS = 'CLE' THEN 1 END) = 0;
逻辑拆解:
GROUP BY A.USERID:按用户ID分组,把同一个用户的所有记录归为一组COUNT(CASE WHEN A.STATUS = 'CLE' THEN 1 END):统计每组中STATUS为'CLE'的记录数。如果用户有哪怕一条CLE记录,这个数就大于0;没有则为0HAVING ... = 0:只保留那些完全没有CLE记录的分组,再用MAX()取出该组的最大SEQNBR
方案二:JOIN方式(需获取最大SEQNBR对应的完整行)
如果你需要的不只是最大值,还要这条最大SEQNBR记录的其他字段,可以用JOIN配合子查询(注意这里的子查询是在FROM里,不是SELECT子句内,符合你的限制):
SELECT A.USERID, CONVERT(CHAR(10), A.SEQNBR, 120) AS MAX_SEQNBR, A.其他字段 -- 按需添加你需要的字段 FROM 你的表名 A INNER JOIN ( SELECT USERID, MAX(SEQNBR) AS TOP_SEQ FROM 你的表名 GROUP BY USERID HAVING COUNT(CASE WHEN STATUS = 'CLE' THEN 1 END) = 0 ) B ON A.USERID = B.USERID AND A.SEQNBR = B.TOP_SEQ;
这个写法先筛选出符合条件的用户和他们的最大SEQNBR,再关联原表拿到对应的完整记录。
记得把代码里的你的表名替换成你实际使用的表名,CONVERT的参数也可以根据你的需求调整哦~
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

