Так как вы не предоставили нам пример входных данных для ваших таблиц, я создал простой пример, который, можно надеяться, можно использовать для изменения вашего запроса:
WITH sample_data AS (SELECT 1 ID, 1 id2, 10 val FROM dual UNION ALL
SELECT 1 ID, 1 id2, 20 val FROM dual UNION ALL
SELECT 1 ID, 2 id2, 30 val FROM dual UNION ALL
SELECT 1 ID, 2 id2, 40 val FROM dual UNION ALL
SELECT 2 ID, 1 id2, 50 val FROM dual UNION ALL
SELECT 2 ID, 2 id2, 60 val FROM dual UNION ALL
SELECT 2 ID, 3 id2, 60 val FROM dual)
SELECT ID,
id2,
max_sum_val
FROM (SELECT ID,
id2,
SUM(val) sum_val,
MAX(SUM(val)) OVER (PARTITION BY ID) max_sum_val
FROM sample_data
GROUP BY ID, id2)
WHERE sum_val = max_sum_val;
ID ID2 MAX_SUM_VAL
---------- ---------- -----------
1 2 70
2 2 60
2 3 60
Это отобразит все id2значения, которые имеют одинаковую сумму (val), которая является самой высокой.Если вы не хотите отображать все связанные строки, вместо этого вы можете использовать аналитическую функцию row_number()
:
WITH sample_data AS (SELECT 1 ID, 1 id2, 10 val FROM dual UNION ALL
SELECT 1 ID, 1 id2, 20 val FROM dual UNION ALL
SELECT 1 ID, 2 id2, 30 val FROM dual UNION ALL
SELECT 1 ID, 2 id2, 40 val FROM dual UNION ALL
SELECT 2 ID, 1 id2, 50 val FROM dual UNION ALL
SELECT 2 ID, 2 id2, 60 val FROM dual UNION ALL
SELECT 2 ID, 3 id2, 60 val FROM dual)
SELECT ID,
id2,
max_sum_val
FROM (SELECT ID,
id2,
SUM(val) sum_val,
row_number() OVER (PARTITION BY ID ORDER BY SUM(val) DESC, id2) rn
FROM sample_data
GROUP BY ID, id2)
WHERE rn = 1;
ID ID2 MAX_SUM_VAL
---------- ---------- -----------
1 2 70
2 2 60
ETA:
Это означает, что ваш запрос закончитсячто-то вроде:
SELECT custid,
companyname,
contactname,
pl_id,
to_char(rev, '$9,999,999.99') rev
FROM (SELECT cc.custid,
cc.companyname,
cc.contactname,
pl.pl_id,
SUM(od.unitprice * od.quantity * (1 - discount)) AS rev,
MAX(SUM(od.unitprice * od.quantity * (1 - discount))) OVER (PARTITION BY cc.custid) max_rev
FROM corp.customers cc
INNER JOIN corp.orders co ON (cc.custid = co.custid)
LEFT OUTER JOIN corp.order_details od ON (co.orderid = od.orderid)
LEFT OUTER JOIN corp.products cp ON (od.productid = cp.productid)
LEFT OUTER JOIN corp.product_lines PL ON (cp.pl_id = pl.pl_id)
GROUP BY cc.custid,
cc.companyname,
cc.contactname,
pl.pl_id)
WHERE rev = max_rev;