2015-02-05 11 views
2

У нас есть большая таблица транзакций и вам нужно попытаться сопоставить строки, где транзакции могут быть сделаны одним и тем же лицом. Задача состоит в том, что нет единственного ключа для их объединения.Соответствие нескольких записей в одной таблице

В каждой строке есть ряд элементов, которые, если сравнивать, должны позволять группировать их вместе.

Так, например, таблица выглядит примерно так:

 ===================== 
    | C1 | C2 | C3 | C4 | 
    --------------------- 
    1 | A | B | C | D | 
    --------------------- 
    2 | B | C | D | A | 
    --------------------- 
    3 | A | B | C | D | 
    --------------------- 
    4 | C | D | A | B | 
    --------------------- 
    5 | A | B | C | D | 
    ===================== 

Таким образом, мы хотим, чтобы иметь возможность группировать операции, которые были «вероятно» сделано одним и тем же лицом на основании согласующих несколько столбцов с другими данные. Ни один из этих других столбцов никогда не будет полностью уникальным, поэтому нам нужно сопоставить записи на как можно большем количестве столбцов, чтобы увеличить вероятность того, что они связаны с одним и тем же человеком.

Group, вероятно, неправильный термин, как мы хотим, чтобы результат как:

 ===================== 
    | C1 | C2 | C3 | C4 | 
    --------------------- 
    1 | A | B | C | D | 
    --------------------- 
    2 | A | B | C | D | 
    --------------------- 
    3 | A | B | C | D | 
    --------------------- 
    4 | B | C | D | A | 
    --------------------- 
    5 | C | D | A | B | 
    ===================== 

Так что в этом случае он отобразил результаты с рядами 1, 2 и 5 вместе, как все они имеют ту же самую информацию в столбцы, которые мы сопоставляем.

Мы пытались что-то вроде:

SELECT * 
FROM group_test gt1, group_test gt2 
WHERE gt1.a = gt2.a 
AND gt1.b = gt2.b 
AND gt1.id != gt2.id; 

, но мы просто в конечном итоге с повторяющимися рядами. Возможно, это даже невозможно, используя только SQL - совершенно невежественный здесь, поэтому любая помощь будет принята с благодарностью!

+0

Возможно, мне что-то не хватает, но похоже, что вы просто хотите заказывать строки? –

+0

Вы уверены, что 'rows 1, 2 и 5 разделяют одну и ту же информацию'? – RubahMalam

+0

Какой результат вы ищете? кажется, что группа по и подсчету доставит вам то, что вы хотите, или, может быть, просто ... – xQbert

ответ

0

Может быть только простой сорт ...

Select C1, C2, C3, C4 
from group_test 
order by C1, C2, C3, C4 

или, возможно, группа по и рассчитывать, чтобы сказать вам, сколько строк совпадают с теми же данными ...

Select count(*), C1, C2, C3, C4 
from group_test 
GROUP BY by C1, C2, C3, C4 

или может быть вы просто нужно завершить свое соединение, чтобы удалить дубликаты ...

SELECT * 
FROM group_test gt1 
INNER JOIN group_test gt2 
    on gt1.a = gt2.a 
AND gt1.b = gt2.b 
AND gt1.c = gt2.c 
AND gt1.d = gt2.d 
WHERE gt1.id != gt2.id; 
+0

Прекрасное спасибо. Полностью пропустил очевидное решение! – 1zebedee23

Смежные вопросы