You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询接受最多宠物美容服务幼犬的主人姓名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:42:45