/ / Oracle SQL - Eliminar duplicados y mantener fila que tiene el valor máximo - sql, oracle, duplicates, max

Oracle SQL: elimine duplicado y mantenga la fila que tiene el valor máximo - sql, oracle, duplicates, max

SELECT
t.trade_id,
co.name,
t.shares,
se.name


FROM trade t
JOIN company co
ON co.stock_id = t.stock_id
JOIN stock_exchange se
ON se.stock_ex_id = t.stock_ex_id
WHERE  se.stock_ex_id IS NOT NULL AND t.shares =( SELECT MAX(t.shares) FROM trade  )
GROUP BY t.trade_id, co.name, t.shares, se.name
ORDER BY co.name
;

Esta consulta muestra nombres de empresas duplicados a lo largo decon diferentes valores de acciones. Mi pregunta es ¿cómo se eliminan los nombres duplicados de la compañía y solo se muestran los nombres de las compañías con el valor de participación máximo basado en sus duplicados?

Traté de usar esta línea t.shares =( SELECT MAX(t.shares) FROM trade ) para obtener los valores máximos de participación, pero no parece funcionar.

Aquí hay una imagen de la tabla que muestra:

enter image description here

Respuestas

0 para la respuesta № 1

Use la consulta a continuación, mostrará los nombres de las empresas con el valor de participación máximo

select trade_id,name,shares,name_1 from
(
SELECT
t.trade_id,
co.name as name,
t.shares,
se.name as name_1,
row_number() over (partition by co.name order by t.shares desc) as R_no
FROM trade t
JOIN company co
ON co.stock_id = t.stock_id
JOIN stock_exchange se
ON se.stock_ex_id = t.stock_ex_id
WHERE  se.stock_ex_id IS NOT NULL
GROUP BY t.trade_id, co.name, t.shares, se.name
ORDER BY co.name
)
where R_no=1

0 para la respuesta № 2

No estoy seguro si creé los datos de prueba correctamente y entendí el requisito:

WITH trade AS (
SELECT 31 TRADE_ID, 1 STOCK_ID, 1 STOCK_EX_ID, 4000 SHARES FROM DUAL UNION ALL
SELECT 52 TRADE_ID, 1 STOCK_ID, 1 STOCK_EX_ID, 1000 SHARES FROM DUAL UNION ALL
SELECT 13 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 2300 SHARES FROM DUAL UNION ALL
SELECT 18 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 72000 SHARES FROM DUAL UNION ALL
SELECT 23 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 24000 SHARES FROM DUAL UNION ALL
SELECT 25 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 400 SHARES FROM DUAL UNION ALL
SELECT 39 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 2300 SHARES FROM DUAL UNION ALL
SELECT 44 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 25000 SHARES FROM DUAL UNION ALL
SELECT 46 TRADE_ID, 2 STOCK_ID, 2 STOCK_EX_ID, 400 SHARES FROM DUAL UNION ALL
SELECT 16 TRADE_ID, 3 STOCK_ID, 1 STOCK_EX_ID, 1500 SHARES FROM DUAL UNION ALL
SELECT 17 TRADE_ID, 3 STOCK_ID, 1 STOCK_EX_ID, 24000 SHARES FROM DUAL UNION ALL
SELECT 21 TRADE_ID, 3 STOCK_ID, 1 STOCK_EX_ID, 1500 SHARES FROM DUAL
),
company AS (
SELECT 1 STOCK_ID, "BNP Paribas" NAME FROM DUAL UNION ALL
SELECT 2 STOCK_ID, "British Airways" NAME FROM DUAL UNION ALL
SELECT 3 STOCK_ID, "EDF" NAME FROM DUAL
),
stock_exchange AS (
SELECT 1 STOCK_EX_ID, "Euronext Paris" NAME FROM DUAL UNION ALL
SELECT 2 STOCK_EX_ID, "London Stock Exchange" NAME FROM DUAL
)
SELECT
MAX(trade_id) KEEP (DENSE_RANK LAST ORDER BY shares) trade_id,
co.name,
MAX(shares) maxshares,
MAX(se.name) KEEP (DENSE_RANK LAST ORDER BY shares) stock_exchange_name
FROM
trade t
JOIN company co ON co.stock_id = t.stock_id
JOIN stock_exchange se ON se.stock_ex_id = t.stock_ex_id
WHERE
se.stock_ex_id IS NOT NULL
GROUP BY
co.name
ORDER BY
co.name