Вы можете присвоить каждой строке ROW_NUMBER
, уникальную для этой пары name
/ amount
, и затем посчитать, есть ли для name
/ ABS(amount)
одно или два значения для каждого из этих ROW_NUMBER
и отбросьте строки, где есть две (одна положительная и одна отрицательная):
SELECT name,
amount
FROM (
SELECT name,
amount,
COUNT( amount ) OVER ( PARTITION BY name, ABS( amount ), rn )
AS num_matches
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY name, amount ORDER BY ROWNUM ) AS rn
FROM table_name t
)
)
WHERE num_matches = 1
Итак, для ваших выборочных данных:
CREATE TABLE table_name ( Name, Amount ) AS
SELECT 'A', +100 FROM DUAL UNION ALL
SELECT 'A', +100 FROM DUAL UNION ALL
SELECT 'A', -100 FROM DUAL UNION ALL
SELECT 'A', +100 FROM DUAL UNION ALL
SELECT 'A', +100 FROM DUAL UNION ALL
SELECT 'A', -100 FROM DUAL UNION ALL
SELECT 'B', +10 FROM DUAL UNION ALL
SELECT 'A', +100 FROM DUAL;
Это выводит:
NAME | AMOUNT
:--- | -----:
A | 100
A | 100
A | 100
B | 10
дБ <> скрипка здесь