我有以下数据:
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
答案 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标准定义的内容,但是我不确定。