Вы также можете попробовать выполнить следующее
select id,cust_id,amount
from YourTable t1
where id =(select max(t2.id) from YourTable t2 where t2.Cust_ID=t1.Cust_ID)
order by id
. Если вы можете добавить во временную таблицу и затем запросить ее, вы можете сделать это за один раз.
WITH T AS (temp table select), RN AS (select min row-numbers from T) SELECT T.NAME, T.DATA1, T.DATA2 FROM T INNER JOIN RN on T.row_number = RN.row_number
Есть много других способов написать это, но вот как я делал подобные вещи.
Использование GROUP BY может помочь вам в этом, но будьте осторожны. Если вы сделаете что-то вроде этого:
Select A.NAME, min(B.DATA1), min(B.DATA2)
From A Inner Join B on A.NAME = B.NAME
Group by A.NAME;
Вы получите искомый результат:
NAME DATA1 DATA2
sameName 1 2
otherName 5 7
Но только из-за данных, которые вы тестируете. Если вы измените данные так, чтобы вместо:
otherName 8 9
у вас было:
otherName 8 4
Возвращается:
NAME DATA1 DATA2
sameName 1 2
otherName 5 4
Обратите внимание, что otherName не возвращает DATA1 и DATA2 из одной и той же записи!
Обновление: самостоятельное соединение сравнение с одним из значений данных может вам помочь, например:
SELECT a.*, b.* FROM a,b
LEFT JOIN b b2 ON b.name = b2.name AND b.data2 < b2.data2
WHERE a.name = b.name AND b2.data2 IS NOT NULL;
Однако это будет работать только в том случае, если значения в DATA2 уникальны для NAME.
Не уверен, решит ли это вашу проблему или нет, но вы можете попробовать использовать предложение GROUP BY и сгруппировать по одному из столбцов имени.
Попробуйте выполнить дедупликацию B следующим образом
SELECT A.NAME, bb.DATA1, bb.DATA2 FROM A JOIN B bb ON A.NAME = B.NAME WHERE NOT EXISTS (SELECT * FROM B WHERE NAME = bb.NAME AND (DATA1 > bb.DATA1 OR DATA1 = bb.DATA1 AND DATA2 > bb.DATA2))
Добавьте дополнительные операторы OR, если существует больше столбцов DATAx.
Если A также содержит дубликаты, просто используйте DISTINCT, как в OP.
Это будет работать:
with temp as (
select A.NAME, B.DATA1, B.DATA2,
row_number() over (partition by A.NAME order by A.NAME) as rownum
from TABLEA A inner join TABLEB B
on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1
Если вы хотите выбрать наименьшее значение data1 и в нем data2, используйте этот вариант:
with temp as (
select A.NAME, B.DATA1, B.DATA2,
row_number() over (partition by A.NAME order by B.DATA1, B.DATA2) as rownum
from TABLEA A inner join TABLEB B
on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1
Оба запроса будут давать по одной строке на имя.