У меня есть следующий запрос для получения данных для фильма:
with Movies as (
select 'Titanic' as title,
1997 as year,
['Drama',' Romance'] as Genres
)
select * from Movies where title='Titanic'
И для фильтрации по тем записям, в которых жанры включают: «Драма»:
with Movies as (
select 'Titanic' as title,
1997 as year,
['Drama',' Romance'] as Genres
)
select * from Movies where "Drama" in UNNEST(Genres)
Однако как мне отфильтровать те записи, которые относятся к жанру «Драма», но включают только те жанры, которые я указал (Драма). Другими словами, я хочу, чтобы набор результатов выглядел так:
title year Genres
Titanic 1997 Drama
И не включать в запись все жанры — мне нужны только те, которые соответствуют жанрам — как мне это сделать?
Обновление: после некоторого возни, вот что сработало для меня - это кажется невероятно хакерским и не совсем понятно, почему это работает (ответ, объясняющий, как лучше это сделать, был бы замечательным), но вот оно:
with Movies as (
select 'Titanic' as title,
1997 as year,
['Drama',' Romance'] as Genres
)
select * from (
select title, year, g from (select title, year, Genres as g from Movies t0, t0.Genres) group by title, year, g
) where g = 'Drama'
Обновление 2: упрощено до:
with Movies as (
select 'Titanic' as title,
1997 as year,
['Drama',' Romance'] as Genres
)
select title, year, Genres from Movies t0, t0.Genres where Genres='Drama'
Попробуйте присоединиться к UNNEST:
with Movies as (
select 'Titanic' as title, 1997 as year, ['Drama',' Romance'] as Genres
)
select title, year, Genre
from Movies, UNNEST(Genres) as Genre
where Genre = "Drama"
FROM Movies, Genres as Genre
просто не будет работать, а FROM Movies, UNNEST(Genres) as Genre
работает :on)
@MikhailBerlyant извините, это опечатка - я имел в виду FROM Movies, Movies.Genres
против FROM Movies, UNNEST(Genres)
FROM Movies, Genres as Genre
попытается найти другую таблицу с именем Genres
и будет тормозить, если у вас ее нет. Вместо этого вы можете использовать from Movies, Movies.Genres as Genre
.
@SergeyGeron Понятно, так как же тогда BQ разрешает столбец UNNEST(Genres)
- какие таблицы он знает для поиска?
Таков синтаксис. UNNEST дает BigQuery подсказку для поиска этого поля внутри другой таблицы из блока WHERE.
В случаях, когда количество столбцов больше, чем несколько, версия ниже также может быть полезна.
select * except(Genres)
from Movies, unnest(Genres) as Genre
where Genre = "Drama"
с выходом
В случае, если вам (по какой-то причине) нужно сохранить имя столбца как жанры и жанры - ниже должно работать
select * except(Genres, Genre), Genre as Genres
from Movies, unnest(Genres) as Genre
where Genre = "Drama"
с выходом
Спасибо. В чем разница между делать
FROM Movies, Genres as Genre
и делатьFROM Movies, UNNEST(Genres) as Genre
?