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在所有地方都做了标记
- 获取唯一名称和姓氏对的列表(其中出现次数>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行,避免它们,标记其他所有内容