Как объединить две таблицы, выбрав столбец с более высоким значением, не используя оператор MERGE? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть две простые таблицы:

источник

id    count  date
6       30  10-28
7       80  10-29
5       20  10-28
4       10  10-27

пункт назначения

id    count  date   
7       10  10-29
5       90  10-28
6       10  10-28

Что я хочусостоит в том, чтобы объединить содержимое источника в место назначения, где их идентификаторы и даты совпадают, а максимальное значение количества сравнивается и выбирается.Запрос также должен иметь возможность вставлять строку из источника в место назначения, если строка с таким идентификатором + дата еще не существует в месте назначения.

После выполнения запроса место назначения должновыглядит так:

id    count  date   
7       80  10-29
5       90  10-28
6       30  10-28
4       10  10-27

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

select id, max(count), date from (
   select id, max(count) as count, date from source group by id, count, date
   union
   select id, max(count) as count, date from destination group by id, count, date
)
group by id, date;

Я использую Amazon Redshift для выполнения своих запросов.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы можете сгенерировать таблицу с помощью union all или full join:

select id, date, max(count) as count
from ((select id, date, count from source
      ) union all
      (select id, date, count from destination
      )
     ) t
group by id, date;

Если вы хотите сохранить эти результаты в таблице, я бы рекомендовал создать новую таблицу и заменитьстарый:

create table new_destination as
    select id, date, max(count) as count
    from ((select id, date, count from source
          ) union all
          (select id, date, count from destination
          )
         ) t
    group by id, date;

truncate table destination;

insert into destination (id, date, count)
    select id, date, count
    from destination;
0 голосов
/ 29 октября 2018

Конечно, MERGE - это просто (более эффективная) замена хорошо известного двухэтапного процесса:

-- first update existing id/date combinations
update dest
set count = src.count
from source
where dest.id    = src.id
  and dest.date  = src.date
  and dest.count < src.count;

-- then insert new id/date combinations
insert into dest
select id, count, date
from src
where not exists
 ( select * from dest
   where dest.id    = src.id
     and dest.date  = src.date
 );
0 голосов
/ 28 октября 2018

greatest может использоваться с left join как:

select s.id, greatest(s.count,d.count) as count, 
       s.date
  from source s
  left join destination d 
    on ( s.id = d.id and s.date = d.date );

PS, если значение в списке внутри greatest (или least для случаев для минимальных значений)оцените значение NULL, тогда оно игнорируется.

Если вы просто не хотите выбирать, а изменять таблицу назначения без оператора слияния, вы можете использовать CTAS ( создать таблицу как ), как в следующем блоке:

create table destination2 as 
select s.id, greatest(s.count,d.count) as count, s.date
  from source s
  left join destination d 
    on ( s.id = d.id and s.date = d.date );

delete from destination;

insert into destination
select * from destination2;

drop table destination2;

select * from destination;
...