SQL查询如何优先取居民首位责任人 无则取首个紧急联系人
实现思路
核心逻辑是给不同类型的联系人设置优先级,再给每个居民的所有符合要求的联系人按规则排序,取排名第一的即可:
- 先给联系人类型分配优先级:Responsible Party优先级最高(赋值1),普通紧急联系人次之(赋值2),其他类型无需纳入的可以直接过滤
- 用窗口函数
ROW_NUMBER()按居民分组,组内先按优先级升序排序,同优先级再按你判定“第一条”的规则排序(比如录入时间升序、主键ID升序) - 最后过滤出每组排序为1的记录,就能实现每个居民仅返回1条符合要求的联系人数据
示例SQL代码
假设你的存储联系人的表名为resident_contacts,用主键ID从小到大判断录入先后(即ID小的为第一条),实现代码如下:
WITH ranked_contacts AS ( SELECT "Resident Name", "Contact Name", "Phone", "Contact Type", ROW_NUMBER() OVER ( PARTITION BY "Resident Name" ORDER BY -- 按类型优先级排序 CASE "Contact Type" WHEN 'Responsible Party' THEN 1 WHEN '紧急联系人' THEN 2 ELSE 99 END ASC, -- 同优先级下按录入先后排序,可替换为你的录入时间字段,比如 create_time ASC id ASC ) AS contact_rank FROM resident_contacts -- 仅保留需要的两类联系人,不需要授权委托人可直接过滤 WHERE "Contact Type" IN ('Responsible Party', '紧急联系人') ) SELECT "Resident Name", "Contact Name", "Phone", "Contact Type" FROM ranked_contacts WHERE contact_rank = 1;
结果验证
针对你给出的示例数据,Jane Doe的两个联系人都属于Responsible Party,优先级均为1,按ID排序后取第一条John Smith的记录,不会返回第二条,完全符合需求。
如果某居民没有登记Responsible Party,排序时会自动匹配优先级为2的普通紧急联系人,取该类型下的第一条记录返回。
内容的提问来源于stack exchange,提问作者Jodi
相关产品推荐
相关产品推荐

