按拼接列分组获取最新日期行报错,求正确SQL实现方式
解决按用户ID+组ID分组取最新创建日期行的SQL错误
错误原因
你写的SQL里,CONCAT是SELECT子句定义的别名,但SQL执行顺序是先处理FROM和WHERE子句,再执行SELECT生成别名。所以子查询的GROUP BY CONCAT以及外层WHERE里引用这个别名时,数据库还没识别到这个名称,就会抛出「无效名称」错误。
解决方案1:使用窗口函数(推荐)
窗口函数可以直接在原表上按USER ID和GROUP ID分组,给每行标记序号,取序号为1的就是每组最新的行,逻辑更清晰:
SELECT [USER ID], [GROUP ID], [DATE CREATED] FROM ( SELECT [USER ID], [GROUP ID], [DATE CREATED], ROW_NUMBER() OVER(PARTITION BY [USER ID], [GROUP ID] ORDER BY [DATE CREATED] DESC) AS rn FROM [TABLE1] ) t WHERE rn = 1;
如果同一组内有多条记录创建日期相同,想保留所有这些行,可以把ROW_NUMBER()换成RANK()。
解决方案2:子查询直接匹配分组字段
如果不想用窗口函数,可以在子查询里直接通过USER ID和GROUP ID匹配分组,避免引用未定义的别名:
SELECT [USER ID], [GROUP ID], [DATE CREATED], CONCAT([USER ID], '_', [GROUP ID]) AS CONCAT FROM [TABLE1] t1 WHERE [DATE CREATED] = ( SELECT MAX([DATE CREATED]) FROM [TABLE1] t2 WHERE t2.[USER ID] = t1.[USER ID] AND t2.[GROUP ID] = t1.[GROUP ID] );
如果只需要分组后的最新日期,也可以直接按两个字段分组,比拼接更高效:
SELECT [USER ID], [GROUP ID], MAX([DATE CREATED]) AS [DATE CREATED] FROM [TABLE1] GROUP BY [USER ID], [GROUP ID];
注意事项
如果USER ID或GROUP ID是数值类型,部分数据库可能需要手动转换为字符串才能拼接,比如SQL Server中可以写成:CONCAT(CAST([USER ID] AS VARCHAR(20)), '_', CAST([GROUP ID] AS VARCHAR(20)))
内容的提问来源于stack exchange,提问作者Justin Jones
相关产品推荐
相关产品推荐

