Mysql SQL。检查列中的条件和标记

Mysql SQL。检查列中的条件和标记,mysql,sql,select,subquery,Mysql,Sql,Select,Subquery,这是我的人名表,我在其中存储姓名、姓氏、出生日期和一些其他数据。在一个新的查询中,我需要为具有相同姓名组合的人添加一个附加列。条件如下: 检查具有相同姓名和姓氏组合的每组人员,在附加字段中标记DOB不是最大值也不是最小值的人员(仅与相同姓名和姓氏进行比较) 如果只有1或2次出现相同的名称和姓氏,请标记它们 这是一个查询的结果 说明: 约翰·多伊只见过一次面 汤姆·泰勒只见过两次面 除了标有min和max DOB的记录外,Alice Smith和Bob Brown在所有地方都做了标记

这是我的人名表,我在其中存储姓名、姓氏、出生日期和一些其他数据。在一个新的查询中,我需要为具有相同姓名组合的人添加一个附加列。条件如下:

  • 检查具有相同姓名和姓氏组合的每组人员,在附加字段中标记DOB不是最大值也不是最小值的人员(仅与相同姓名和姓氏进行比较)
  • 如果只有1或2次出现相同的名称和姓氏,请标记它们

这是一个查询的结果

说明:

  • 约翰·多伊只见过一次面
  • 汤姆·泰勒只见过两次面
  • 除了标有min和max DOB的记录外,Alice Smith和Bob Brown在所有地方都做了标记
请帮助形成所需输出的SQL查询。以下是我的理解(猜测)

  • 获取唯一名称和姓氏对的列表(其中出现次数>2??)
  • 对于每个唯一对,查找具有最小和最大DOB的行(避免它们)
  • 在一个新的复选框列中,标记那些剩余的(不是极值)

首先
按姓名、姓氏分组
获取每个姓名和姓氏的出现次数以及最小和最大dob,并将结果加入表格。
通过案例陈述,应用以下条件:

select 
  p.*,
  case  
    when g.counter in (1, 2) then 'mark'
    else case
      when p.dob not in (g.mindob, g.maxdob) then 'mark' 
    end
  end Checkbox
from peaople inner join (
  select 
    name, surname,
    count(*) counter,
    min(dob) mindob,
    max(dob) maxdob
  from people
  group by name, surname
) g on g.name = p.name and g.surname = p.surname

在MySQL 8+中使用窗口函数:

select p.*,
       (case when count(*) over (partition by name, surname) <= 2
             then 'mark'
             when row_number() over (partition by name, surname order by dob) > 1 and
                  row_number() over (partition by name, surname order by dob desc) > 1
             then 'mark'
        end) as checkbox
from people p;
选择p.*,
(计数(*)超过(按姓名划分)1和
行数()超过(按名称划分,按dob desc排序)>1
然后“马克”
结束)作为复选框
来自人民党;

注:如果最早或最晚的出生日期有重复项,则仅排除其中一个。如果您想排除所有这些,请使用
rank()
而不是
row_number()

我能想到的另一种方法是:选择出现唯一名称和姓氏>2的最小和最大DOB行,避免它们,标记其他所有内容