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
相关产品推荐
相关产品推荐

