2012-02-23 34 views
1

我必須創建一個每月自動編譯的報告。該報告只需要是2個應用程序(Rails應用程序,稱爲應用程序A和B)的電話號碼的唯一計數。每個應用程序都有一個PostgreSQL數據庫,電話號碼是表格中的列。在每個應用程序中獲取唯一的電話號碼數很容易,只是一個'SELECT COUNT(DISTINCT phone_number)...'查詢。然而,我不能想出一個簡單/有效的方式來跨越兩個應用程序(另外,應用程序A在表中有500k條記錄,應用程序B有8k條記錄)。看起來我必須從兩張桌子上拿出所有電話號碼,把它們放在一起,然後丟棄重複。問題在於內存中處理的記錄太多。對報告的建議

任何人都有最好的方法來做到這一點的意見?下面是一些額外的信息:

  • 這兩個應用程序在同一臺服務器
  • 數據庫服務器也是這個服務器
  • 的應用程序在不同的數據庫上
  • 生成/電子郵件發送的報告將是一個cron工作
  • 我寧願做最紅寶石編程,最好的應用程序之一

回答

1

SQL有UNION方法可能成爲你想要的......在數據庫中,你可以在你的兩個查詢之間從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 2012-02-23 05:03:50

+0

我錯過了,對不起。但是對於組合和uniq!,這仍然有效,不是嗎? – xlash 2012-02-23 15:05:19

+0

是的,這是可行的,但這不是我的問題。 Rubyist,所以如何從數組中拋出重複項並不是我正在尋找的答案,我需要建議_automatically_獲得總的唯一數字計數的最佳方法。我的第一個想法是隻從每個數據中提取數據,將它轉儲到一個文件中,然後讓另一個腳本執行上面的操作,問題是500k條記錄太多(太慢) – Austin 2012-02-23 15:18:37

-1

那這則:

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

會給你算的散列值,和值。將2個結果合併在一起,你就有了答案。

+0

哇。我想你完全沒有讀過我的問題。 – Austin 2012-03-01 18:14:16

+0

等一下,你就是上面評論過的那個人。 WTF? – Austin 2012-03-01 18:36:13

+0

該查詢完全按照您在數據庫中所評論的內容進行操作,無需將所有500k記錄全部拉出並放入內存中。它會爲您返回爲每個數據庫計算的響應。對不起,如果這對你沒有幫助,你應該更清楚,看起來沒有其他人能夠理解它,否則你會有其他答案。並感謝有人試圖幫助你。 – xlash 2012-03-05 07:13:04

0

對於訪問不同的數據包裝程序,請根據您的Pg版本查看dblink和/或外部數據包裝程序。

然後你可以在PostgreSQL中完全做到這一點。請記住,您可能想要執行一些操作,例如確保兩臺服務器僅返回非重複記錄。因此,假如你正在使用外籍家政工人的,並假設你有國外的表PNA和PNB成立,是這樣的:

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; 

這當然應該僅9.1工作,但你可以做DBLINK和PostgreSQL 8.4及更高版本類似的東西。