Советы по отчету - PullRequest
       2

Советы по отчету

2 голосов
/ 23 февраля 2012

Я должен создать отчет, который автоматически составляется ежемесячно.В отчете просто должно быть уникальное количество телефонных номеров в двух приложениях (приложения Rails, называйте их приложениями A и B).Каждое приложение имеет базу данных PostgreSQL, а номера телефонов - это столбцы в таблице.Получить уникальный счетчик телефонных номеров в каждом приложении легко, это всего лишь запрос «ВЫБЕРИТЕ СЧЕТЧИК (DISTINCT phone_number) ...».Однако я не могу придумать простой / эффективный способ сделать это в обоих приложениях (кроме того, приложение A имеет 500 тыс. Записей в таблице, а приложение B - 8 тыс.).Кажется, мне придется вытащить все телефонные номера из обеих таблиц, собрать их вместе и выбросить дубликаты.Проблема в том, что в памяти слишком много записей.

У кого-нибудь есть совет, как лучше всего это сделать?Вот некоторая дополнительная информация:

  • Оба приложения находятся на одном сервере
  • Сервер базы данных также находится на этом сервере
  • Приложения находятся в разных базах данных
  • Создание / отправка отчета по электронной почте будет задачей cron
  • Я бы предпочел выполнять большую часть программирования на ruby, желательно в одном из приложений

Ответы [ 3 ]

1 голос
/ 29 сентября 2012

Для доступа к различным оболочкам данных загляните в 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и выше.

1 голос
/ 23 февраля 2012

В SQL есть метод UNION, который может быть тем, что вы ищете ... В базе данных вы сможете получать значения DISTINCT из UNION между вашими 2 запросами.

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!

Надеюсь, это то, что вы искали!

0 голосов
/ 24 февраля 2012

Что об этом тогда:

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

Даст вам хэш счетчика и значения.Объедините 2 результата вместе, и вы получите ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...