PostgreSQL按族群分组查询表列最高频值的SQL实现方法
你当前的写法存在两个核心问题:
- GROUP BY子句中包含了主键字段
sas_id,这会导致每个分组只有单条记录,mode()聚合函数无法按照officer_defined_ethnicity维度统计整个族群的object_of_search高频值 - 统计族群总搜查数、逮捕率的逻辑不需要用窗口函数,直接使用普通聚合函数配合按
officer_defined_ethnicity分组即可
修正后的查询语句如下,完全符合不使用SELECT子句中子查询、关联子查询的要求:
SELECT officer_defined_ethnicity, count(sas_id) AS "Sas for ethnicity", sum(case when outcome = 'Arrest' then 1 else 0 end)::float / count(sas_id)::float * 100 AS "Arrest rate", mode() WITHIN GROUP (ORDER BY object_of_search) AS "Most frequent object of search" FROM stopAndSearches GROUP BY officer_defined_ethnicity;
该语句仅按officer_defined_ethnicity做唯一分组,所有聚合逻辑都在同一分组维度下执行,每个族群只会返回一行结果,和你期望的输出格式完全匹配。
内容的提问来源于stack exchange,提问作者Aliaksei A. Shysh
相关产品推荐
相关产品推荐

