SQL按街区分组统计最高频姓名及语法报错排查
报错原因排查
- 核心语法错误:你把CTE(公共表表达式)的定义片段直接写在了第一个查询的
GROUP BY子句内部,GROUP BY后只允许罗列分组字段,解析器读到不该出现的Max Count片段时直接抛出语法异常,也就是你看到的EOF预期错误。 - CTE用法完全不符合规范:定义CTE必须以
WITH关键字开头,多个CTE之间用逗号分隔;你既没有写WITH关键字,还先后写了Max Count、Counts、MaxCounts三个不统一的表名,前后引用完全断层,即使语法不报错也会报表不存在的错误。 - 语句结构断裂:你写的三段查询逻辑(统计频次、计算分区最大值、筛选结果)之间没有用正确的语法拼接,是零散的片段,数据库无法按顺序执行。
正确实现代码
你的核心思路(先分组统计频次、再用窗口函数算每个街区的最高频次、最后匹配筛选结果)是对的,只需要把零散的逻辑用标准CTE语法拼接即可,可直接运行的代码如下:
WITH Counts AS ( -- 统计每个街区下每个host姓名的出现次数 SELECT host_name, neighbourhood_group, COUNT(*) AS Ct FROM AB_NYC_2019 GROUP BY host_name, neighbourhood_group ), MaxCounts AS ( -- 按街区分区,匹配每个街区对应的最高出现次数 SELECT *, MAX(Ct) OVER (PARTITION BY neighbourhood_group) AS MaxCt FROM Counts ) -- 筛选出每个街区下出现频次等于最高值的姓名 SELECT neighbourhood_group, host_name FROM MaxCounts WHERE Ct = MaxCt;
补充说明:如果同一街区下有多个姓名的出现次数并列第一,上述SQL会返回所有并列的姓名。如果要求每个街区仅返回1个姓名,可以把窗口函数逻辑替换为
ROW_NUMBER() OVER (PARTITION BY neighbourhood_group ORDER BY Ct DESC) AS rn,最后筛选rn=1即可。
内容的提问来源于stack exchange,提问作者bobo8219
相关产品推荐
相关产品推荐

