Найдите самое популярное имя для женщин в 1885, 1915, 1945, 1975 и 2005 годах, используя SparkSQL - PullRequest
0 голосов
/ 20 января 2020

Мне нужно найти самое популярное имя для женщин в 1885, 1915, 1945, 1975 и 2005 годах.

ТАБЛИЦА ИНФОРМАЦИИ:

SSANames (имя, год, пол)

ПРИМЕР ОЖИДАЕМОГО ВЫХОДА:

firstName / year / total_count (Martha, 1885, 732) (Bessy, 1915, 1004) (Шарлотта, 1945, 999) (Ashley, 1975, 574) ( Jessica, 2005, 942)

Не могу понять, как создать этот запрос.

Вот где я ...

SELECT
  firstName,
  year,
  count(firstName) AS total_count
FROM SSANames
WHERE
  year IN ("1885", "1915", "1945", "1975", "2005")
GROUP BY
  firstName,
  year

Мне нужно запустить MAX в столбце total_count за указанные годы и возвращает соответствующее firstName, но я не уверен, как это сделать.

Ответы [ 3 ]

0 голосов
/ 27 марта 2020

Hi! Я думаю, что это ответ, который вы ищете:

SELECT firstName, year, total
FROM (
      SELECT firstName, gender, year, total, 
      ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY TOTAL DESC) AS ROW_NUM
      FROM SSANames 
      WHERE gender = 'F' AND year IN (1885, 1915, 1945, 1975,2005) 
      GROUP BY firstName, gender, year, total ORDER BY total DESC
      ) SS
WHERE SS.ROW_NUM = 1

Надеюсь, это поможет вам.

0 голосов
/ 10 апреля 2020

Вы можете ответить на этот вопрос, используя такие функции окна Spark SQL.

%sql
CREATE OR REPLACE TEMPORARY VIEW HistoricNames AS
SELECT
  firstName, year, total
FROM (
  SELECT
    firstName, year, total,
    dense_rank() OVER (PARTITION BY year ORDER BY total DESC) as rank
  FROM SSANames
  WHERE year IN (1885, 1915, 1945, 1975, 2005) AND gender = 'F'
  ) tmp
WHERE
  rank = 1
ORDER BY total

Подробнее об этом здесь .

0 голосов
/ 20 января 2020

Использовать оконные функции:

SELECT yf.*
FROM (SELECT year, firstName, COUNT(*) as cnt,
             ROW_NUMBER() OVER (PARTITION BY year ORDER BY COUNT(*) DESC) as seqnum
      FROM SSANames
      WHERE year IN (1885, 1915, 1945, 1975, 2005) AND
            gender = 'F'
      GROUP BY year, firstName
     ) yf
WHERE seqnum = 1;

Обратите внимание, что в случае связей это возвращает произвольное наиболее распространенное значение. Если вы хотите все из них, используйте rank() вместо row_number().

...