2016-10-24 3 views
0

전자 메일 목록이 포함 된 테이블에 열이 있습니다. 테이블에있는 유사한 이메일 목록에서 최신 이메일을 보관해야합니다. 예를 들면. 다음과 같이 테이블 요소가 포함되어있는 경우 :PostgreSQL의 테이블 열에서 유사한 레코드를 제거하는 방법

+--------------------------+------------------------+ 
|   Email   |  Received at  | 
+--------------------------+------------------------+ 
| [email protected]  | 2016-08-04 20:56:53+00 | 
| [email protected] | 2016-08-04 10:56:53+00 | 
| [email protected]  | 2016-08-04 06:57:46+00 | 
| [email protected] | 2016-08-04 13:54:42+00 | 
+--------------------------+------------------------+ 

아래의 링크를 사용하여 나는 서로 유사있는 이메일을 찾을 수 있었다, 다음과 같이

+--------------------------+------------------------+ 
|   Email   |  Received at  | 
+--------------------------+------------------------+ 
| [email protected]  | 2016-08-04 20:56:53+00 | 
| [email protected]   | 2016-08-04 20:56:52+00 | 
| [email protected]   | 2016-08-04 20:56:51+00 | 
| [email protected] | 2016-08-04 10:56:53+00 | 
| [email protected]   | 2016-08-04 10:56:52+00 | 
| [email protected]   | 2016-08-04 06:57:32+00 | 
| [email protected]  | 2016-08-04 06:57:46+00 | 
| [email protected] | 2016-08-04 13:54:42+00 | 
+--------------------------+------------------------+ 

최종 출력해야한다. 그들을 그룹화하는 것은 다음 단계입니다. 나는 그것을 이해할 수 없었다.

Finding similar strings with PostgreSQL quickly

UPDATE : 전체 데이터 세트에 대한 확실하지

CREATE EXTENSION pg_trgm; 

DROP TABLE IF EXISTS roshan_email_list; 

CREATE TEMPORARY TABLE roshan_email_list AS (
SELECT EXTRACT(MONTH 
FROM received_at) AS MONTH, EXTRACT(YEAR 
FROM received_at) AS YEAR, 
email 
FROM users 
group by month, year, email 
); 

CREATE INDEX roshan_email_list_gist ON roshan_email_list 
USING gist(email gist_trgm_ops); 

SELECT set_limit(0.75); 

-- The below query gives the similarity between emails 
WITH email_similarity AS 
(
SELECT similarity(n1.email, n2.email) AS sim, 
n1.email AS email, n2.email AS similar_email, 
n1.month, n1.year 
FROM roshan_email_list n1 
JOIN roshan_email_list n2 ON n1.email <> n2.email AND n1.email % n2.email AND n1.month = n2.month AND n1.year = n2.year 
WHERE n1.year = 2016 
ORDER BY sim DESC 
) 
SELECT e.sim, e.email, u.received_at, 
e.similar_email, e.month, e.year 
FROM email_similarity e 
INNER JOIN callinize.users u ON e.email = u.email; 
+1

비슷한 질문을 찾으려면 (** [편집] **) –

답변

0

: 나는 주석의 요청에 따라 여기에 이메일 사이의 유사성을 제공하는 코드를 추가했습니다.

with data as (
    select 
    split_part(email, '@', 1) as first, 
    split_part(split_part(email, '@', 2), '.', 1) as second, 
    received_at, 
    email 
    from emails 
), 
ndata as (
    select *, 
    row_number() over (partition by first, second order by received_at desc) 
    from data 
) 
select 
    email, received_at 
from ndata 
where row_number = 1; 
+0

쿼리를 사용하십시오. 하지만 내 테이블에는 작동하지 않는 항목이 있다는 것을 알게되었습니다. 그에 따라 질문을 업데이트했습니다. –

+0

저장 프로 시저를 사용해야한다고 생각합니다. 단순한 쿼리로는 실현 가능하지 않습니다. – Nikhil

관련 문제