2012-02-23 5 views
1

매월 자동으로 컴파일되는 보고서를 만들어야합니다. 이 보고서는 2 개의 앱 (Rails 앱, 앱 A 및 B라고 함)의 전화 번호가 고유해야합니다. 각 앱마다 PostgreSQL 데이터베이스가 있으며 전화 번호는 테이블의 열입니다. 각 앱에서 고유 한 전화 번호를 알아내는 것은 쉽습니다. 'SELECT COUNT (DISTINCT phone_number) ...'쿼리 일뿐입니다. 그러나, 나는 두 애플 리케이션을 통해 그것을 할 수있는 간단하고 효율적인 방법을 생각해 낼 수 없다 (또한, 애플 A는 테이블에 500k 레코드를 가지고 있고, 애플 B는 8k를 가지고있다). 두 테이블에서 모든 전화 번호를 꺼내서 함께 넣고 중복 된 것을 던져야 할 것 같습니다. 문제는 메모리에서 처리 할 레코드가 너무 많다는 것입니다.보고서에 대한 조언

누구나 최선의 방법에 대해 조언 해 주시겠습니까? 여기에 몇 가지 추가 정보는 다음과 같습니다

  • 두 응용 프로그램은 동일한 서버
  • 데이터베이스 서버는
  • 애플 리케이션은 서로 다른 데이터베이스에있는이 서버에 있습니다에있는
  • 생성/보고서를 이메일로 전송하는 것 크론 나는 애플 리케이션 중 하나에 바람직하게, 루비 프로그래밍의 대부분을 선호하는 것 일

답변

1

SQL은 수도 노조 방법이있다 데이터베이스에서 UNION에서 DISTINCT 값을 가져올 수 있습니다.

SELECT DISTINCT ON (phone_number) FROM 
(<subquery1> 
UNION ALL 
<subquey2> 
); 

이렇게하면 매우 효율적인 SQL 쿼리를 얻을 수 있습니다. 이제 Rails 관점에서이를 구현하고 두 쿼리의 결과를 얻으려면 고유 한 유효성 검사를 수행하는 것이 가장 좋습니다.

results1 = Table1.select('DISTINCT phone_number') 
results2 = Table2.select('DISTINCT phone_number') 

results = (results1 + results2).uniq! 

희망하시는 분께! 이 다음에 대해

+0

테이블이 다른 데이터베이스에 있습니다. 나는 그것이 간단했다는 것을 바란다 : ( – Austin

+0

나는 그것을 놓친다, 미안하다. 그러나 조합과 uniq!를 위해, 그것은 아직도 일할 것이다, 그렇지 않다? – xlash

+0

그래, 그것은 일할 것이다. 그러나 그것은 나의 문제가 아니다. 루비 스트, 배열에서 중복을 버리는 방법은 내가 찾고있는 대답이 아닙니다. _automatically_ 숫자의 총 고유 수를 얻는 가장 좋은 방법에 대한 조언이 필요합니다. 첫 번째 생각은 각각의 데이터를 가져 오는 것입니다. , 파일을 덤프 및 다른 스크립트를 위의 일을 할 수 있습니다. 문제는 500k 레코드를 너무 큽니다 (너무 느린). – Austin

-1

무엇 :

Table1.count(:group => 'phone_number') 

는 당신에게 수의 해시와 가치를 제공 할 것입니다. 2 개의 결과를 하나로 합치면 답을 얻을 수 있습니다.

+0

와우. 나는 내 질문을 완전히 읽지 않았다고 생각합니다. – Austin

+0

잠깐, 당신은 위와 같은 사람입니다. WTF? – Austin

+0

이 쿼리는 모든 500k 레코드를 가져 와서 메모리에 저장하지 않고 데이터베이스에서 위에서 언급 한 것과 정확히 일치합니다. 그것은 당신에게 각 DB에 대해 계산 된 응답을 반환합니다. 미안해 이것이 도움이되지 않는다면, 당신은 더 분명 해졌고, 아무도 다른 사람들을 이해하지 못했을 것입니다. 그렇지 않으면 다른 대답을했을 것입니다. 그리고 당신을 도와 주려고하는 누군가를위한 downvote에 감사드립니다. – xlash

0

다른 데이터 래퍼에 액세스하려면 Pg 버전에 따라 dblink 및/또는 외부 데이터 래퍼를 살펴보십시오.

그러면 PostgreSQL에서 전적으로 할 수 있습니다. 두 서버가 비 중복 레코드 만 리턴하도록하는 것과 같은 일을하고 싶을 것입니다. 그래서 당신은 FDW의를 사용하고, 당신이 외국 테이블 PNA를 가지고 설정 PNB 같은 가정합니다 가정 : 물론이 9.1로 작동합니다

WITH pnas (phone_number) AS (
     SELECT phone_number 
     FROM pna 
    GROUP BY phone_number 
), 
pnbs (phone_number) as (
     SELECT phone_number 
     FROM pnb 
    GROUP BY phone_number 
), 
pns (phone_number) AS (
     SELECT phone_number 
     FROM pnas 
     UNION 
     SELECT phone_number 
     FROM pnbs 
) 
SELECT count(*) 
    FROM pns; 

을,하지만 당신은 DBLINK과 PostgreSQL 8.4 이상과 비슷한 뭔가를 할 수 .