You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 11:35:31