#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.