You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中统计IMDB电影数据库的Top 10独立电影类型?

拆分竖线分隔的电影类型字段并统计Top10单个类型

要解决这个问题,核心是把genres字段中用|分隔的多值拆分成独立行,再对单个类型分组统计。不同SQL数据库的实现方法略有不同,以下是几种常用方案:

MySQL 实现方案

使用递归CTE(公共表表达式)逐步拆分每个电影的类型字段:

WITH RECURSIVE genre_split AS (
    SELECT
        movie_title,
        SUBSTRING_INDEX(genres, '|', 1) AS genre,
        SUBSTRING(genres, LENGTH(SUBSTRING_INDEX(genres, '|', 1)) + 2) AS remaining_genres
    FROM imdb_movies_column_drop
    WHERE genres IS NOT NULL AND genres != ''
    UNION ALL
    SELECT
        movie_title,
        SUBSTRING_INDEX(remaining_genres, '|', 1) AS genre,
        SUBSTRING(remaining_genres, LENGTH(SUBSTRING_INDEX(remaining_genres, '|', 1)) + 2) AS remaining_genres
    FROM genre_split
    WHERE remaining_genres IS NOT NULL AND remaining_genres != ''
)
SELECT
    genre,
    COUNT(DISTINCT movie_title) AS Number_of_Movie
FROM genre_split
GROUP BY genre
ORDER BY Number_of_Movie DESC
LIMIT 10;
  • 递归CTE会循环拆分genres字段,直到剩余的类型字符串为空
  • COUNT(DISTINCT movie_title)确保同一部电影不会在多个类型统计中重复计数

PostgreSQL 实现方案

利用内置的string_to_array和unnest函数快速拆分:

SELECT
    unnest(string_to_array(genres, '|')) AS genre,
    COUNT(DISTINCT movie_title) AS Number_of_Movie
FROM imdb_movies_column_drop
WHERE genres IS NOT NULL AND genres != ''
GROUP BY genre
ORDER BY Number_of_Movie DESC
LIMIT 10;
  • string_to_array将分隔的类型字符串转为数组,unnest把数组展开为独立行

SQL Server 实现方案

使用STRING_SPLIT函数(适用于2016及以上版本):

SELECT
    value AS genre,
    COUNT(DISTINCT movie_title) AS Number_of_Movie
FROM imdb_movies_column_drop
CROSS APPLY STRING_SPLIT(genres, '|')
WHERE genres IS NOT NULL AND genres != ''
GROUP BY value
ORDER BY Number_of_Movie DESC
LIMIT 10;
  • CROSS APPLY会为每一行电影生成拆分后的类型行,再进行分组统计

原语句问题说明

你之前的SQL语句是按完整的组合类型字符串分组,所以得到的是Action|Adventure这类组合的电影数量,而非单个类型的独立统计结果。上述方案通过拆分字段,实现了对单个类型的计数。

内容的提问来源于stack exchange,提问作者Prakhar Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:10:16