Обобщение запроса Top N в BigQuery - PullRequest
0 голосов
/ 18 мая 2019

Это дополнительный вопрос для обобщения случая для Лучшие N результатов в BigQuery для нескольких столбцов .Давайте теперь возьмем следующие данные:

 year   genre         studio            title       revenue
2014    fantasy       fox               avatar      10
2015    fantasy       fox               avatar      12
2016    fantasy       fox               avatar      12
2015    action        sony              spider-man  10
2015    romance       paramount         love letter 15
2015    action        sony              spider-man  10
2015    action        sony              spider-man  10
2015    action        disney            toy story   10
2015    action        sony              edgar       4
2015    action        sony              thomas      1
2015    fantasy       fox               avatar      2

Я хотел бы получить следующие результаты для построения древовидной структуры:

Past 2 years, Top 2 genres (Alphabetically), Top 2 studios (by Count), Top 2 titles by SUM Revenue DESC

И поэтому мы получили бы что-то вроде:

enter image description here

Концептуально запрос, который я ищу, выглядит примерно так:

SELECT year, genre, studio, title, SUM(revenue)
FROM titles
GROUP BY year, genre, studio, title

// in pseudocode
ORDER BY
    (year DESC) LIMIT 2,
    (genre ASC) LIMIT 10,
    (COUNT(studio) DESC) LIMIT 2,
    (SUM(revenue) DESC) LIMIT 2

Что былучший подход к выполнению вышеизложенного, который был бы скорее обобщением построения древовидной структуры в BQ.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Отфильтруйте строки за первые 2 года в подзапросе, а также найдите количество фильмов по студии и сумму дохода по названию.

Затем найдите рейтинг по жанру, студии, доходу и фильтру для топ-2.

select year, genre, studio, title, revenue 
from (
    select year, genre, studio, title, revenue,
        dense_rank() over (partition by year order by genre) as genre_rank,
        dense_rank() over (partition by year, genre order by count_by_studio desc) as studio_rank,
        dense_rank() over (partition by year, genre, studio order by revenue_by_title desc) as title_rank
    from (
        select year,
            genre,
            studio,
            title,
            revenue,
            dense_rank() over (order by year desc) as year_rank,
            count(*) over (partition by year, genre, studio) as count_by_studio,
            sum(revenue) over (partition by year, genre, studio, title) as revenue_by_title
        from titles
    ) where year_rank <= 2
) where genre_rank <= 2
and studio_rank <= 2
and title_rank <= 2;
1 голос
/ 21 мая 2019

Я не могу найти 'avatar2' в вашем наборе данных, но он есть в результате. Таким образом, я не смог проверить ответ на вопрос. Это запрос SQL Server, который я предложил. Надеюсь, изменений не потребуется.

 WITH A as 
    (SELECT 
    year, 
    genre, 
    studio,
    COUNT(*) OVER (PARTITION BY year, genre, studio) AS studio_movie_count,
    title,
    revenue,
    SUM(revenue) OVER (PARTITION BY year, genre, studio,title) AS revenue_sum FROM movies),

    B as

    (SELECT 
    year,
    DENSE_RANK() OVER (ORDER BY year DESC) AS year_num, 
    genre,
    DENSE_RANK() OVER (PARTITION BY year ORDER BY genre ASC) AS genre_num,
    studio,
    DENSE_RANK() OVER (PARTITION BY year, genre ORDER BY studio_movie_count DESC) AS studio_num,
    title,
    DENSE_RANK() OVER (PARTITION BY year, genre, studio ORDER BY revenue_sum DESC) AS title_num,
    revenue

    FROM A)

    SELECT year, genre, studio, title, revenue
    FROM B
    WHERE year_num < 3 AND
    genre_num < 3 AND
    studio_num < 3 AND
    title_num < 3;
...