对报告的建议

时间:2012-02-23 04:35:31

标签: ruby-on-rails ruby postgresql cron

我必须创建一个每月自动编译的报告。报告只需要是两个应用程序(Rails应用程序,称为应用程序A和B)的电话号码的唯一计数。每个应用程序都有一个PostgreSQL数据库,电话号码是表格中的列。获取每个应用程序中唯一的电话号码很容易,它只是一个'SELECT COUNT(DISTINCT phone_number)...'查询。但是,我无法在两个应用程序中提出一种简单/有效的方法(同样,app A在表中有500k记录,app B有8k)。看来我必须从两张桌子中取出所有电话号码,把它们放在一起然后扔掉重复的电子邮件。问题是在内存中处理的记录太多了。

有人建议最好的方法吗?这是一些额外的信息:

  • 两个应用都在同一台服务器上
  • 数据库服务器也在此服务器上
  • 应用程序位于不同的数据库
  • 生成/通过电子邮件发送报告将是一项重要工作
  • 我更喜欢在ruby中完成大部分编程,最好是在其中一个应用程序中

3 个答案:

答案 0 :(得分:1)

SQL有一个UNION方法,可能就是您要查找的...在数据库中,您可以在2个查询之间从UNION中提取DISTINCT值。

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

这将为您提供非常有效的SQL查询。现在,如果您想从Rails角度实现这一点,从两个查询中获取结果,那么执行唯一验证将是最好的。

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

results = (results1 + results2).uniq!

希望这就是你要找的东西!

答案 1 :(得分:1)

为了访问不同的数据包装器,请查看dblink和/或外部数据包装器,具体取决于您的Pg版本。

然后你可以在PostgreSQL中完全做到这一点。请记住,您可能想要确保两台服务器仅返回非重复记录。因此,假设您正在使用fdw并假设您设置了外部表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及更高版本做类似的事情。

答案 2 :(得分:-2)

那么呢:

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

会给你一个计数和值的哈希值。将2个结果合并在一起,你就得到了答案。