查询接受最多宠物美容服务幼犬的主人姓名SQL实现求助
解决方法:查询接受美容服务次数最多幼犬的主人姓名
嘿,我来帮你把这个SQL查询补全!你已经迈出了第一步——关联了Puppy和Owner表,但还需要结合Service_Done表统计每只幼犬的服务次数,再定位到次数最多的那只对应的主人。
步骤拆解
- 统计幼犬服务次数:从
Service_Done表按Puppy_ID分组,计算每只幼犬的美容服务次数。 - 筛选次数最多的幼犬:用窗口函数或嵌套子查询定位次数最高的记录(支持多只幼犬次数并列第一的场景)。
- 关联主人信息:将统计结果与
Puppy、Owner表关联,最终获取主人姓名。
完整SQL示例(推荐窗口函数版本)
这个写法简洁且能处理并列第一的情况:
-- 先统计每只幼犬的服务次数并排名 WITH PuppyServiceStats AS ( SELECT sd.Puppy_ID, COUNT(*) AS total_services, -- 按服务次数倒序排名,次数相同的幼犬排名一致 RANK() OVER (ORDER BY COUNT(*) DESC) AS service_rank FROM Service_Done sd GROUP BY sd.Puppy_ID ) -- 关联到主人表获取姓名 SELECT o.Owner_Name FROM PuppyServiceStats stats JOIN Puppy p ON stats.Puppy_ID = p.Puppy_ID JOIN Owner o ON p.Owner_ID = o.Owner_ID WHERE stats.service_rank = 1;
子查询替代版本
如果你更习惯嵌套子查询的写法,也可以用这个:
SELECT o.Owner_Name FROM Owner o JOIN Puppy p ON o.Owner_ID = p.Owner_ID JOIN ( -- 统计每只幼犬的服务次数 SELECT Puppy_ID, COUNT(*) AS service_count FROM Service_Done GROUP BY Puppy_ID -- 筛选出服务次数等于最大值的幼犬 HAVING COUNT(*) = ( SELECT MAX(counts.service_count) FROM ( SELECT COUNT(*) AS service_count FROM Service_Done GROUP BY Puppy_ID ) AS counts ) ) sd ON p.Puppy_ID = sd.Puppy_ID;
对你现有代码的补充说明
你之前写的Select owner_name from puppy p, owner o where p.owner_id = o.owner_ID仅完成了幼犬与主人的关联,但缺少了服务次数统计和最大值筛选的核心逻辑。上面的查询通过整合Service_Done表的统计逻辑,补上了这两个关键步骤。
内容的提问来源于stack exchange,提问作者Raymundo Lopez
相关产品推荐
相关产品推荐

