SQL — Как добавить именованные столбцы, непосредственно соответствующие идентификатору, когда соединение не охватывает их

#sql #join #presto

Вопрос:

Я пытаюсь объединить две таблицы на основе даты, идентификатора и страны. В таблице 1 есть дополнительный столбец, который непосредственно соответствует столбцу идентификатора таблицы 1

 | Date      | ID      |Country|ID name                 |Clicks
| ----------| --------|-------|------------------------|------- |
| 25/02/2021| 42587750|Spain  |Targeting Details Spain |5
| 26/02/2021| 42587750|Spain  |Targeting Details Spain |15
 

Однако в другой таблице страны отслеживаются несколько иначе, поэтому она выглядит так

 Table 2
| Date      | ID      |Country|Clicks
| ----------| --------|-------|------|
| 25/02/2021| 42587750|Spain  |4
| 25/02/2021| 42587750|France |1
| 26/02/2021| 42587750|Spain  |13
| 26/02/2021| 42587750|Italy  |2
 

Я хочу видеть все случаи стран, поэтому в настоящее время я сделал полное присоединение на основе даты, идентификатора и страны. Однако это приводит к получению таких данных

Дата table1.ID таблица 1.Страна table2.ID таблица 2.Страна Идентификационное имя таблица 1.Щелчки таблица 2.клики
25/02/2021 42587750 Испания 42587750 Испания Детали таргетинга Испания 5 4
26/02/2021 42587750 Испания 42587750 Испания Детали таргетинга Испания 15 13
25/02/2021 42587750 Франция 1
25/02/2021 42587750 Италия 1

Я использовал это для соединения:

 from table1 full outer join table2 on table1.date=table2.date and table1.ID=table2.ID and table1.country=table2.country
 

Где у меня есть все правильные данные, когда все 3 вещи, к которым я присоединяюсь, совпадают, но когда страна другая, у меня больше нет идентификационного имени.

Можно ли использовать идентификационное имя, даже если страна не совпадает, при вводе в страну?

Я могу получить правильные цифры, когда я беру информацию на уровне страны, например, вот так

 from table1 full outer join table2 on table1.date=table2.date and table1.ID=table2.ID 
 

Я пробовал использовать функцию AVG вместо СУММЫ кликов, но это не сработало.

Комментарии:

1. спасибо @ankit за исправление форматирования!

2. Какое значение идентификатора вы ожидаете для другой страны и где оно хранится?

3. Пожалуйста, предоставьте примеры данных и желаемые результаты, чтобы проиллюстрировать, что вы хотите сделать.

4. Привет @AnkitBajpai, я ожидал, что имя идентификатора будет соответствовать идентификаторам. Так что в этом случае я бы ожидал, что все 42587750 идентификаторов будут содержать сведения о таргетинге, такие как имя идентификатора

Ответ №1:

Структурирован ли ваш запрос с использованием coalesce() ?

 select coalesce(t1.date, t2.date) as date,
       coalesce(t1.id, t2.id) as id,
       coalesce(t1.country, t2.country),
       coalesce(t1.idname, max(t1.idname) over (partition by coalesce(t1.id, t2.id)) as idname,
       t1.clicks, t2.clicks
from table1 t1 full outer join
     table2 t2
     on t1.date = t2.date and 
        t1.ID = t2.ID and
        t1.country = t2.country
 

Комментарии:

1. Сервер регистрирует этот бит [«max»(aggregate.line_item_id) ПОВЕРХ (РАЗДЕЛЕНИЕ ПО ОБЪЕДИНЕНИЮ(aggregate.line_item_id, dbm.line_item_id))] в качестве агрегации, функции окна или функции группировки и жалуется на наличие этого внутри функции group by

2. @Аки … Это не имеет смысла. Это оконная функция, и Presto должен справиться с этим просто отлично. В запросе нет функций агрегирования, поэтому я подозреваю, что выполняемый вами запрос отличается от этого.

3. вероятно, что-то в том, что я не ставлю правильные скобки в нужном месте. спасибо @gordon за это, хотя я просто поиграю с линией

4. @Aki . . . Я могу продемонстрировать, что он работает с использованием других баз данных, но я не знаю «скрипки» для Presto online.