BigQuery: возвращает первое значение из разных групп в группе. - PullRequest
0 голосов
/ 14 марта 2019

У меня сейчас проблема со стандартным запросом SQL. У меня есть список писем, где каждое письмо может иметь несколько функций. Ниже приведен пример того, как выглядит таблица.

Email                         Function
peter@gmail.com               engineer
peter@gmail.com               specialist
dave@gmail.com                analyst
dave@gmail.com                tester
dave@gmail.com                manager
michael@gmail.com             intern

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

Email                         Function
peter@gmail.com               engineer
dave@gmail.com                analyst
michael@gmail.com             intern

Как мне это сделать?

Сейчас у меня есть упрощенная версия запроса.

SELECT Email, Function
FROM database
GROUP BY Email, Function

Проблема здесь в том, что я должен поместить электронную почту и функцию в GROUP BY. Если я только помещаю электронную почту в группу «По», запрос не может быть запущен, хотя я хочу, чтобы запрос был отправлен только по электронной почте GROUP BY.

Спасибо!

Ответы [ 4 ]

1 голос
/ 14 марта 2019

Не существует такой вещи, как «первая» функция, потому что таблицы SQL представляют неупорядоченные наборы, особенно в параллельной базе данных, разработанной с нуля, такой как BigQuery.

Вам нужно использовать какую-то функцию агрегирования.

Простым является any_value():

SELECT Email, ANY_VALUE(Function)
FROM database
GROUP BY Email;

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

1 голос
/ 14 марта 2019

Использование row_number() оконная функция

select * from
(
select *, row_number() over(partition by email order by funcion) as rn
from tablename
)a where rn=1
1 голос
/ 14 марта 2019

использование row_number() аналитическая функция

with cte as
(select * ,row_number() over(partition by email order by Function) rn
from table
) select * from cte where rn=1
0 голосов
/ 14 марта 2019

Вам нужен столбец заказа, в котором указан порядок столбцов, тогда вы можете сделать:

select t.*
from table t
where t.pk = (select min(t1.pk) from table t1 where t1.email = t.email);

Здесь предполагается, что pk - столбец идентификаторов.

...