Рассмотрим следующее ...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,user_id INT NOT NULL
,retailer_id INT NOT NULL
,amount_spent INT NOT NULL
);
INSERT INTO my_table (user_id,retailer_id,amount_spent) VALUES
(1,2,30),
(1,2,10),
(1,2,28),
(1,3,10),
(1,3,40),
(2,1,20);
Следующий запрос покажет нам все строки без какой-либо другой комбинации (user_id, retailer) в пределах 30% от другой (моя арифметика c или логи *) 1010 * может быть слегка искажен, но, надеюсь, вы поняли идею) ...
SELECT a.*
FROM my_table a
LEFT
JOIN
( SELECT y.*
FROM my_table x
JOIN my_table y
ON y.id <> x.id
AND y.user_id = x.user_id
AND y.retailer_id = x.retailer_id
AND y.amount_spent BETWEEN x.amount_spent * 0.3 AND x.amount_spent * 1.3
) b
ON b.id = a.id
WHERE b.id IS NULL;
+----+---------+-------------+--------------+
| id | user_id | retailer_id | amount_spent |
+----+---------+-------------+--------------+
| 4 | 1 | 3 | 10 |
| 5 | 1 | 3 | 40 |
| 6 | 2 | 1 | 20 |
+----+---------+-------------+--------------+
При необходимости, мы можем дополнительно уточнить это следующим образом
SELECT a.user_id
, a.retailer_id
FROM my_table a
LEFT
JOIN
( SELECT y.*
FROM my_table x
JOIN my_table y
ON y.id <> x.id
AND y.user_id = x.user_id
AND y.retailer_id = x.retailer_id
AND y.amount_spent BETWEEN x.amount_spent * 0.3 AND x.amount_spent * 1.3
) b
ON b.id = a.id
WHERE b.id IS NULL
GROUP
BY a.user_id
, a.retailer_id
HAVING COUNT(*) > 1;
+---------+-------------+
| user_id | retailer_id |
+---------+-------------+
| 1 | 3 |
+---------+-------------+