SQL查询中如何按全部列分组,无需逐个列明列名?
按全表列分组并计算MAX(date)的实用方案
你不想逐个写GROUP BY列的需求很常见,下面按不同数据库给出直接可行的办法:
用窗口函数(推荐,适配多数现代数据库)
窗口函数能绕开GROUP BY的繁琐,直接计算每组的最大日期,再用DISTINCT去重拿到唯一分组结果:
SELECT DISTINCT *, MAX(date) OVER (PARTITION BY 所有列) AS max_date FROM your_table;
不同数据库的简化写法:
- PostgreSQL/SQL Server/Oracle:直接用
PARTITION BY *指代全表列SELECT DISTINCT *, MAX(date) OVER (PARTITION BY *) AS max_date FROM your_table; - MySQL 8.0+:不支持
PARTITION BY *,但可以用表别名加星号替代SELECT DISTINCT t.*, MAX(t.date) OVER (PARTITION BY t.*) AS max_date FROM your_table t;
数据库专属GROUP BY语法
有些数据库支持直接指定按全表列分组:
- PostgreSQL:直接用
GROUP BY *即可,会自动匹配SELECT里的所有非聚合列(也就是你选的*)SELECT *, MAX(date) FROM your_table GROUP BY *; - SQL Server:可以写
GROUP BY your_table.*来指定全表列SELECT *, MAX(date) FROM your_table GROUP BY your_table.*; - MySQL:如果你的环境关闭了
ONLY_FULL_GROUP_BY(不建议长期这么用,可能出非预期结果),或者直接写GROUP BY your_table.*SELECT *, MAX(date) FROM your_table GROUP BY your_table.*;
一次性生成GROUP BY列列表
如果上面的方法都用不了,还能查系统表自动生成列名,复制粘贴就行:
- MySQL:
SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR ', ') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = '你的表名'; - PostgreSQL:
SELECT string_agg(column_name, ', ') FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '你的表名';
内容的提问来源于stack exchange,提问作者Avrahad
相关产品推荐
相关产品推荐

