在数组字段上聚合

时间:2019-06-16 22:53:11

标签: sql arrays database

我有以下数据:

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 个答案:

答案 0 :(得分:2)

  

这是大多数数据库引擎如何在数组字段上进行聚合吗?

“大多数数据库引擎”不支持以数组开头。就我所知,只有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

我知道支持数组的三个RDBMS将按“完整数组”而不是单个元素分组。至少在Postgres中,元素的顺序很重要,['romance', 'classic']是与['classic', 'romance']不同的数组。

因此GROUP BY genres将返回三个不同的行。

认为这也是SQL标准定义的内容,但是我不确定。