Oracle SQL取行最大值并隐藏重复行 筛选疫苗最高接种计数记录
Oracle SQL 按疫苗ID筛选最高接种人次记录实现方案
直接使用 Oracle 内置的窗口排序函数即可实现需求,逻辑为:对相同idvaccine的所有记录按接种人次倒序排序,仅保留排序为第一位的记录即可。
实现代码(推荐写法)
WITH vacc_inoc_stats AS ( -- 第一步:先统计各地点各疫苗的接种人次 SELECT vaccines.placename, vaccinetype.idvaccine, COUNT(*) AS inoc_total FROM vaccines, request, vaccinetype WHERE request.idvaccine = vaccines.idvaccine AND vaccinetype.idvaccine = request.idvaccine GROUP BY vaccines.placename, vaccinetype.idvaccine ), vacc_rank AS ( -- 第二步:按疫苗ID分组,组内按接种人次倒序排序打排名标签 SELECT placename, idvaccine, inoc_total, -- 同疫苗下接种人次越高排名越靠前 ROW_NUMBER() OVER(PARTITION BY idvaccine ORDER BY inoc_total DESC) AS rank_num -- 若需保留同疫苗下所有接种人次并列最高的记录,把上方ROW_NUMBER()替换为RANK()即可 FROM vacc_inoc_stats ) -- 第三步:仅取每个疫苗排名第一的记录 SELECT placename, idvaccine, inoc_total FROM vacc_rank WHERE rank_num = 1 ORDER BY placename, idvaccine;
简化写法(单层级子查询)
如果不需要拆分统计和排序逻辑,也可以直接嵌套一层查询实现:
SELECT placename, idvaccine, inoc_total FROM ( SELECT vaccines.placename, vaccinetype.idvaccine, COUNT(*) AS inoc_total, ROW_NUMBER() OVER(PARTITION BY vaccinetype.idvaccine ORDER BY COUNT(*) DESC) AS rank_num FROM vaccines, request, vaccinetype WHERE request.idvaccine = vaccines.idvaccine AND vaccinetype.idvaccine = request.idvaccine GROUP BY vaccines.placename, vaccinetype.idvaccine ) t WHERE rank_num = 1 ORDER BY placename, idvaccine;
补充说明
如需在多个地点接种人次并列最高时按固定规则选唯一记录,可以在窗口函数的
ORDER BY后追加排序条件,比如ORDER BY inoc_total DESC, placename ASC就会在人次相同时优先取地点名称排序靠前的记录。
内容的提问来源于stack exchange,提问作者jawionfan
相关产品推荐
相关产品推荐

