SQL查询不聚合也不加入group by的列能否正常展示对应值?
需求实现方案
该需求可以实现,主流SQL方言均支持对应写法,不需要将store字段加入GROUP BY子句,也不需要对store做聚合操作,即可实现每组仅返回cost最高的一行数据。
方案1:窗口函数实现(推荐,支持所有现代SQL数据库)
适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等支持窗口函数的数据库,性能更优,逻辑清晰:
SELECT id, name, cost, store FROM ( SELECT id, name, cost, store, -- 按id+name分组,组内按cost倒序排序生成行号 ROW_NUMBER() OVER (PARTITION BY id, name ORDER BY cost DESC) AS rn FROM test ) AS temp_table WHERE rn = 1; -- 仅取每组排序第一的行
注意:如果同一id、name组内存在多行cost相同且都是最大值的情况,
ROW_NUMBER()会随机返回其中一行;如果需要返回所有最高cost的行,可以将ROW_NUMBER()替换为RANK()。
方案2:关联子查询实现(兼容旧版数据库)
适用于MySQL 5.x等不支持窗口函数的低版本数据库:
SELECT a.id, a.name, a.cost, a.store FROM test a INNER JOIN ( -- 先查询每个id+name组的最高cost SELECT id, name, MAX(cost) AS max_cost FROM test GROUP BY id, name ) AS b ON a.id = b.id AND a.name = b.name AND a.cost = b.max_cost;
注意:该写法在组内存在多个相同最高cost的行时,会返回所有符合条件的行,若需要强制每组仅返回一行,可根据业务需求补充额外去重逻辑。
内容的提问来源于stack exchange,提问作者mistershoko
相关产品推荐
相关产品推荐

