Агрегирование в поле массива - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующие данные:

movie (string)         genres (string[])
"titanic"              ["romance", "historical", "drama"]
"spider-man"           ["sci-fi", "action"]
"casablanca"           ["romance", "classic"]

Существует ли "стандартный" способ - по крайней мере, концептуально - агрегировать в поле массива?Например, сделать что-то вроде:

SELECT genres, count(*) GROUP BY genres ORDER BY count(*) DESC, genres

Если мне кажется, что результат должен быть примерно таким:

genres         count
"romance"      2
"action"       1
"classic"      1
"drama"        1
"historical"   1
"sci-fi"       1

Это то, как большинство движков дБ агрегируют в поле массива?Если да (или если нет), не могли бы вы привести несколько примеров того, как агрегации будут выполняться в этом движке?

Обычно, когда я это делаю, я получаю жалобы и вынужден вручную выполнить это преобразование, например, вПанды:

df=pd.DataFrame({'movie':['titanic', 'spider-man', 'casablanca'], 'genres': [['romance', 'historical', 'drama'], ['sci-fi', 'action'],['romance','classic']]})
df.groupby('genres').first() # will error, or converting to tuple will not unnest the array

1 Ответ

2 голосов
/ 17 июня 2019

Является ли так, что большинство механизмов дБ агрегируют в поле массива?

«Большинство механизмов БД» не поддерживают массивы с самого начала. Насколько мне известно, только Postgres, H2 и HSQLDB полностью поддерживают массивы.

В стандарте SQL вам потребуется unnest() массив для достижения этого (ниже приведен синтаксис Postgres, но я думаю, что он довольно близок к стандарту SQL):

SELECT ut.genre, count(*) 
FROM the_table
  cross join lateral unnest(genres) as ut(genre) 
GROUP BY ut.genre 
ORDER BY count(*) DESC, ut.genre

Три СУБД, которые я знаю, что поддерживающие массивы будут группироваться по «полному массиву», а не по отдельным элементам. И, по крайней мере, в Postgres порядок элементов имеет значение, ['romance', 'classic'] - это массив, отличный от ['classic', 'romance'].

Таким образом, GROUP BY genres вернет три отдельных строки.

Я думаю это также то, что определяет стандарт SQL, но я не уверен в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...