Устранить повторяющиеся данные - PullRequest
1 голос
/ 22 сентября 2010

Запрос

SELECT
  ppc.personid,
  ppc.category,
  ppc.phonenumber,
  ppc.createts
FROM
  person_phone_contacts ppc
WHERE  
      CURRENT_TIMESTAMP BETWEEN ppc.createts AND ppc.endts
  AND CURRENT_DATE BETWEEN ppc.effectivedate AND ppc.enddate
ORDER BY
  ppc.personid, ppc.category, ppc.createts DESC

Результирующие данные

3742 | Home   | xxx-xxx-xxxx | 2009-09-09 11:59:00.357-04
3742 | Home   | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04*
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04*
3742 | Other  | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04

* Желаемые дубликаты для удаления.

Желаемые данные

3742 | Home   | xxx-xxx-xxxx | 2009-09-09 11:59:00.357-04
3742 | Mobile | xxx-xxx-xxxx | 2009-09-09 11:59:20.070-04
3742 | Other  | xxx-xxx-xxxx | 2009-08-04 20:13:17.161-04

Вопрос

Какой самый эффективный способ получения одного телефонного номера для категории на человека с использованием самой последней даты (даже если несколько телефонных номеров в одной категории для одного человека имеют одну и ту же дату)?

Возможные решения

Использование DISTINCT ON (ppc.category) category может ограничить результаты на человека, но как применить его ко всем людям, индивидуально?

Ограничения

  • PostgreSQL 8.3
  • Нет сохраненных функций или процедур

Спасибо!

1 Ответ

1 голос
/ 22 сентября 2010

Предполагая, что (personid, category, createts) уникален ...

SELECT
  ppc.personid,
  ppc.category,
  ppc.phonenumber,
  ppc.createts
FROM
  person_phone_contacts AS ppc
  INNER JOIN (
    SELECT
      personid,
      category,
      MAX(createts) AS newest_createts
    FROM
      person_phone_contacts
    WHERE  
          CURRENT_TIMESTAMP BETWEEN createts AND endts
      AND CURRENT_DATE BETWEEN effectivedate AND enddate
    GROUP BY
      personid, category
  ) AS ppc2
  ON ppc.personid = ppc2.personid
    AND ppc.category = ppc2.category
    AND ppc.createts = ppc2.newest_createts

Я не знаком с диалектом Postgres SQL (использую сам MSSQL, где это можно было бы решить более элегантно),но так как это в значительной степени стандартный SQL, я думаю, что он должен работать.

...