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

GreenPlum 300列宽表分组取max(update_date) 无需全列加聚合方法咨询

解决方案

首先你原有SQL存在两处明显错误:

  • GROUP BY后加了单引号包裹primary_key,相当于按常量分组,无法实现按订单维度聚合取最新值的需求
  • 非聚合的返回字段未加入GROUP BY子句,在绝大多数SQL执行引擎中都会直接报语法错误

下面给出两种无需为所有300个字段逐个添加聚合函数的实现方式:

方式1:窗口函数(推荐,适配MySQL8.0+、PostgreSQL、Hive、Spark SQL、Oracle等所有支持窗口函数的引擎)

通过ROW_NUMBER窗口函数给每个订单的记录按更新时间倒序排序,取排序第一的记录即可直接带出全字段:

WITH order_ranked AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY order_num ORDER BY update_date DESC) AS rn
    FROM orders
    WHERE order_date = '2021-07-01'
      AND update_date BETWEEN '2021-07-01' AND '2021-08-01'
)
SELECT * EXCEPT(rn) FROM order_ranked WHERE rn = 1;

说明:如果引擎不支持EXCEPT(rn)语法,手动列出需要的字段或者直接SELECT *带上rn字段后业务侧过滤即可;如果同一订单同一update_date下存在多条记录需要全部保留,将ROW_NUMBER替换为RANK()即可。

方式2:关联子查询(适配低版本不支持窗口函数的引擎,如MySQL5.x)

先通过子查询拿到每个订单的最大更新时间,再关联原表匹配到对应的全字段记录:

SELECT t1.*
FROM orders t1
INNER JOIN (
    SELECT order_num, MAX(update_date) AS max_update
    FROM orders
    WHERE order_date = '2021-07-01'
      AND update_date BETWEEN '2021-07-01' AND '2021-08-01'
    GROUP BY order_num
) t2 ON t1.order_num = t2.order_num AND t1.update_date = t2.max_update
WHERE t1.order_date = '2021-07-01'
  AND t1.update_date BETWEEN '2021-07-01' AND '2021-08-01';

内容的提问来源于stack exchange,提问作者user13335832

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:09:03