2012-02-23 62 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及更高版本类似的东西。