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

Oracle中GREATEST函数结合OVER PARTITION BY的使用及多列查询求助

解决方案

首先修正原SQL的语法错误(GROUP BY关键字顺序错误),同时针对你需要查询的非聚合列(customer_name、location等),提供两种可行方案:

方案1:扩展GROUP BY子句(适用于分组键与非聚合列一一对应场景)

如果customerid是CUSTOMER表的主键,customer_name、location等列与customerid、aread_code一一对应,可以直接将这些列加入GROUP BY,同时计算目标聚合值:

SELECT
    c.customerid,
    c.aread_code,
    c.customer_name,
    c.location,
    c.gender,
    c.address,
    GREATEST(MAX(o.productid), MAX(o.itemid)) AS max_id_value
FROM
    CUSTOMER c
INNER JOIN
    "ORDER" o ON c.custid = o.custid
WHERE
    c.custtype = 'EXECUTIVE'
GROUP BY
    c.customerid, c.aread_code, c.customer_name, c.location, c.gender, c.address;

注意:ORDER是SQL关键字,需用双引号(部分数据库用方括号如[ORDER])包裹避免语法错误。

方案2:使用窗口函数PARTITION BY(无需GROUP BY)

通过窗口函数在不分组的前提下,计算每个customerid+aread_code分组的聚合值,再通过去重得到唯一的客户记录:

方式A:DISTINCT去重

SELECT DISTINCT
    c.customerid,
    c.aread_code,
    c.customer_name,
    c.location,
    c.gender,
    c.address,
    GREATEST(
        MAX(o.productid) OVER (PARTITION BY c.customerid, c.aread_code),
        MAX(o.itemid) OVER (PARTITION BY c.customerid, c.aread_code)
    ) AS max_id_value
FROM
    CUSTOMER c
INNER JOIN
    "ORDER" o ON c.custid = o.custid
WHERE
    c.custtype = 'EXECUTIVE';

方式B:行号去重(更灵活)

SELECT
    customerid,
    aread_code,
    customer_name,
    location,
    gender,
    address,
    max_id_value
FROM (
    SELECT
        c.customerid,
        c.aread_code,
        c.customer_name,
        c.location,
        c.gender,
        c.address,
        GREATEST(
            MAX(o.productid) OVER (PARTITION BY c.customerid, c.aread_code),
            MAX(o.itemid) OVER (PARTITION BY c.customerid, c.aread_code)
        ) AS max_id_value,
        ROW_NUMBER() OVER (PARTITION BY c.customerid, c.aread_code ORDER BY (SELECT NULL)) AS rn
    FROM
        CUSTOMER c
    INNER JOIN
        "ORDER" o ON c.custid = o.custid
    WHERE
        c.custtype = 'EXECUTIVE'
) t
WHERE rn = 1;

关键说明

  • 原SQL的错误点:GROUP customerid, by aread_code语法错误,正确写法为GROUP BY customerid, aread_code
  • 窗口函数OVER (PARTITION BY ...)会为每个分组计算聚合值,无需将非聚合列加入GROUP BY,适合需要保留详细列同时计算分组统计的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:30:43