2016-07-09 3 views
1

Я хочу создать таблицу, которая указывает медицинских поставщиков, которые связаны общими членами. Например, если я перейду к prov 1 и prov 2, то prov 1 и prov 2 будут связаны, потому что я посетил оба.Удалить повторяющиеся записи в улье

У меня есть таблица, в которой каждая запись указывает, что участник посещает провайдера на определенную дату. Таблица содержит миллионы членов и тысячи доказательств. Ниже приведен небольшой пример таблицы:

member prov date 
    1  1  1/1/15 
    1  2  1/2/15 
    2  16  1/12/14 
    2  5  1/1/16 

Я пытаюсь создать таблицу, в которой каждая запись указывает на два различных провайдеров они связаны общим элементом. Например:

member prov1 prov2 date1 date2 
    1   1  2  1/1/15 1/2/15 
    2  16  5  1/12/14 1/1/16 

Я пытаюсь использовать внутреннее соединение в одной таблице, но он возвращает повторяющиеся записи. Я думал, что отдельное положение исправит это, но, похоже, это не делает работу. Мой запрос показан ниже:

select distinct a.member, a.prov, b.prov, a.date, b.date 
from table1 as a 
inner join table1 as b 
on a.member=b.member 

Этот запрос возвращает отдельные записи, но есть записи, содержащие одну и ту же информацию. Ниже приведен пример:

a.member a.prov b.prov a.date b.date 
    1   1   2  1/1/15 1/2/15 
    1   2   1  1/2/15 1/1/15 

Выше мы видим, что записи различны, но они описывают одну и ту же информацию. Ниже приводится то, что я хочу вернуть запрос:

a.member a.prov b.prov a.date b.date 
    1   1   2  1/1/15 1/2/15 

Как изменить указанный выше запрос, чтобы я возвращал только отдельные данные? Я не хочу 1 запись на каждого участника. Я хочу 1 запись для каждого отдельного члена пары.

ответ

0

Одним из вариантов является использование conditional aggregation с подзапроса с использованием row_number:

select member, 
     max(case when rn = 1 then prov end) prov1, 
     max(case when rn = 2 then prov end) prov2, 
     max(case when rn = 1 then date end) date1, 
     max(case when rn = 2 then date end) date2 
from (select member, 
      prov, 
      date, 
      row_number() over (partition by member order by prov, date) rn 
     from table1) t 
group by member 
+0

Это будет работать, но я буду использовать таблицу с сотнями миллионов строк. Это не будет практично делать это для всех записей. –

+0

@ RyanCaldwell - Если я не ошибаюсь, то, что вы пытаетесь сделать, называется таблицей 'pivoting'. Ожидаете ли вы динамический список столбцов? Если это так, вам придется использовать 'dynamic sql'. Это, вероятно, самый эффективный подход, хотя, если вы знаете, что не будет более 2 'prov's per' member' ... – sgeddes

+0

В каждом члене может быть много разных аргументов. Будут тысячи различных отличных представительств и миллионы отдельных членов. –

Смежные вопросы