Лучшие N результатов в BigQuery по нескольким столбцам - PullRequest
0 голосов
/ 18 мая 2019

Допустим, у меня есть следующие записи:

id   studio        movie
1    fox           avatar
2    paramount     transformers
etc.

И я хочу получить запрос из двух лучших студий по количеству названий, а также по первым 3 фильмам, отсортированным по алфавиту. Результаты будут выглядеть примерно так:

studio (top 2 by title cnt)        title (top 3 alphabetically)
fox                                avatar
fox                                avatar2
fox                                avatar3
sony                               ace in the hole
sony                               antonio
sony                               spider-man

Как бы я сделал запрос, чтобы получить это? Пока что у меня есть что-то вроде этого, но я не уверен, как сделать сортировку в конце:

select * from `table` where studio in (
    SELECT studio FROM `table` group by studio order by count(*) desc limit 3
) 

Ответы [ 2 ]

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

Ниже для BigQuery Standard SQL

#standardSQL
SELECT studio, title
FROM (
  SELECT studio, ARRAY_AGG(movie ORDER BY movie LIMIT 3) movies
  FROM `project.dataset.table`
  GROUP BY studio
  ORDER BY COUNT(movie) DESC
  LIMIT 2
), UNNEST(movies) title 
1 голос
/ 18 мая 2019

Вам нужно будет использовать некоторую комбинацию оконных функций (например, ROW_NUMBER) и агрегирование.

Вот один из возможных подходов (я составил таблицу идентификаторов, поэтому вам придется вставить свой собственный):

WITH studio_counts AS
    (

        SELECT
            studio
            ,ROW_NUMBER() OVER(ORDER BY COUNT(studio) DESC) As rownum
        FROM
            project.dataset.movies
        GROUP BY
            studio
    )

SELECT
    mc.studio
    ,mc.movie_title
FROM
    (
        SELECT
            m.studio
            ,m.movie_title
            ,ROW_NUMBER() OVER(PARTITION BY m.studio ORDER BY m.movie_title) AS rownum2
        FROM
            studio_counts AS sc

            INNER JOIN project.dataset.movies AS m
            ON sc.studio = m.studio
        WHERE
            sc.rownum < 3
    ) AS mc
WHERE
    mc.rownum2 < 4
...