SQL。检查条件并在列中标记

时间:2019-06-16 21:48:18

标签: mysql sql select subquery

这是我的PEOPLE表,我在其中存储姓名,姓氏,DOB(出生日期)和其他一些数据。在一个新的查询中,我需要添加其他列,其中包含姓名和姓氏组合相同的人的条件。这是条件:

  • 遍历具有相同名称和姓氏组合的每一组人员,在其他字段中标记DOB不是最大也不是最小(仅与相同名称和姓氏相比)的那些人
  • 如果只有1或2个相同的名字和姓氏,请务必将其标记为

enter image description here

这是查询的结果

enter image description here

说明:

  • John Doe被标记为只见过一次
  • 汤姆·泰勒(Tom Taylor)只见过两次
  • 爱丽丝·史密斯(Alice Smith)和鲍勃·布朗(Bob Brown)在所有地方都进行了标记,但记录中记录了最小和最大DOB

请帮助形成所需输出的SQL查询。这是我的理解(猜测)

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

2 个答案:

答案 0 :(得分:1)

首先group by name, surname以获得出现次数以及每个名称和姓氏的最小和最大dob并将结果联接到表中。
对于CASE语句,请应用条件:

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

答案 1 :(得分:0)

在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;

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