如何用SQL获取每个城市对应最高City_count的Key及相关数据?
问题分析与解决
你的窗口函数写法存在两个核心错误:
- 语法错误:
DENSE_RANK()是独立的排名函数,不能直接搭配FIRST关键字使用,这不是合法的SQL语法。 - 排序逻辑冗余:已经按
City分区,同一分区内的City值完全相同,排序时不需要再指定City,只需要按City_count DESC来确定行的优先级即可。
正确实现方式
方法1:使用DENSE_RANK()筛选排名第一的行
这种方式会保留每个城市中所有City_count并列最高的行(如果存在多个),是最通用的写法:
WITH ranked_city_data AS ( SELECT "Key", City, City_count, -- 按城市分区,区内按City_count降序排名 DENSE_RANK() OVER (PARTITION BY City ORDER BY City_count DESC) AS city_rank FROM your_table_name ) SELECT "Key", City, City_count FROM ranked_city_data WHERE city_rank = 1;
方法2:使用ROW_NUMBER()(适合唯一最高值场景)
如果确定每个城市只有唯一的最高City_count,可以用ROW_NUMBER()替代DENSE_RANK(),它会给每行分配唯一的序号:
WITH numbered_city_data AS ( SELECT "Key", City, City_count, ROW_NUMBER() OVER (PARTITION BY City ORDER BY City_count DESC) AS row_num FROM your_table_name ) SELECT "Key", City, City_count FROM numbered_city_data WHERE row_num = 1;
说明
- 注意
Key是SQL关键字,不同数据库需要用对应符号包裹:MySQL用反引号`Key`,PostgreSQL/ SQL Server用双引号"Key"。 - 替换
your_table_name为你实际使用的表名。
用你的测试数据验证,上述两种方法都能得到期望的输出:
Key City City_count 13 Columbus 30 16 Grove City 15
内容的提问来源于stack exchange,提问作者user1009073
相关产品推荐
相关产品推荐

