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

SQL查询实现:按姓名分组标记is_primary_mo无1值的记录

SQL实现方案

你可以通过窗口函数MAX() OVER ()实现分组判断逻辑,不需要嵌套子查询也能完成组内全局校验,修改后的查询语句如下:

SELECT 
    b.last_name, 
    b.first_name, 
    a.is_primary_mo, 
    a.street_address_1,
    -- 按姓名分组判断是否存在主岗标记
    CASE WHEN MAX(a.is_primary_mo) OVER (PARTITION BY b.last_name, b.first_name) != 1 
         THEN 'NP' 
         ELSE NULL END AS mark
FROM staff_office_demographics_byprimary_view a
INNER JOIN staff_view b
  ON a.staff_id = b.staff_id
-- 原排序规则重复写了last_name,这里调整为按姓名排序更合理
ORDER BY b.last_name, b.first_name

结果说明

执行上述语句后,返回的结果会新增mark列,和你给出的示例数据对应的返回结果如下:

last_nameFirst_Nameis_primary_mostreet_address_1mark
8712BANTT1Center 1NULL
8712BANTT0Center ANULL
8713TANNE0Center 2NP
8713TANNE0Center 5NP

如果你不需要NULL值显示,可以把ELSE分支的内容改成你需要的默认值即可。

兼容低版本MySQL的实现方案

如果你使用的是不支持窗口函数的MySQL 5.x版本,可以用子查询先统计每个姓名组是否有主岗标记,再关联回原查询:

SELECT 
    b.last_name, 
    b.first_name, 
    a.is_primary_mo, 
    a.street_address_1,
    CASE WHEN t.has_primary = 0 THEN 'NP' ELSE NULL END AS mark
FROM staff_office_demographics_byprimary_view a
INNER JOIN staff_view b ON a.staff_id = b.staff_id
LEFT JOIN (
    SELECT b2.last_name, b2.first_name, MAX(a2.is_primary_mo) AS has_primary
    FROM staff_office_demographics_byprimary_view a2
    INNER JOIN staff_view b2 ON a2.staff_id = b2.staff_id
    GROUP BY b2.last_name, b2.first_name
) t ON b.last_name = t.last_name AND b.first_name = t.first_name
ORDER BY b.last_name, b.first_name

内容的提问来源于stack exchange,提问作者Speech4free Speech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:57:03