我正在构建一个应用程序
我的SQL数据库中有一个Student表 这有以下结构
(
Student_ID int,
FullName varchar(255),
FirstName varchar(255),
LastName varchar(255),
FatherName varchar(255),
Father_FirstName varchar(255),
Father_LastName varchar(255),
Date_of_Birth datetime,
Gender varchar(10),
Date_of_Registration datetime,
Regestration_Status varchar(10),
Degree_Status varchar(10),
Qualification varchar(15),
Campus varchar(15),
Batch int,
Degree varchar(10)
)
此表中收集的数据来自4个不同的城市KARACHI,ISLAMABAD,PESHAWAR,KARACHI
从白沙瓦收集的学生数据没有设置性别属性,因此在整个表中,来自白沙瓦的学生的性别列不包含任何值。
我的主管要求我通过关联规则填写表格中的这个补丁,大部分学生姓名在表格中非常相似,如果有特定的名称,例如" USMAN"如果60个USMAN行具有性别MALE,那么在整个表格中有100个名称如USMAN,无论他们来自哪个城市,那么在白沙瓦是城市的补丁中的任何一行,并且学生的名字是Usman我应该设置其性别对男性
我希望我已经明确了我的问题我试图通过一些SQL查询来完成这项工作,如果任何人可以帮助我我会非常感谢
答案 0 :(得分:0)
这是设置性别列的好方法。首先按名字汇总开始:
select FirstName, count(*), sum(case when gender = 'M' then 1 else 0 end) as NumMales,
avg(case when gender = 'M' then 1.0 else 0.0 end) as MalePercent,
(case when avg(case when gender = 'M' then 1.0 else 0.0 end) > 0.5 then 'M'
else 'F'
end) as ImputedGender
from Students s
where gender is not null
group by FirstName
接下来,您需要查看结果并设置截止值。具有特定姓名的单身男性或女性学生并不相信该名称会指定性别。所以,假设你需要至少五个例子和一个性别的80%:
select FirstName, count(*), sum(case when gender = 'M' then 1 else 0 end) as NumMales,
avg(case when gender = 'M' then 1.0 else 0.0 end) as MalePercent,
(case when avg(case when gender = 'M' then 1.0 else 0.0 end) > 0.5 then 'M'
else 'F'
end) as ImputedGender
from Students s
where gender is not null
group by FirstName
having count(*) >= 5 and
avg(case when gender = 'M' then 1.0 else 0.0 end) not between 0.2 and 0.8
下一步是将估算的性别分配给行。这可能取决于各种SQL。这就像:
update Students
set gender = ImputedGender
from (<the above query>) ig
where ig.Firstname = Students.FirstName and
Students.city <> 'Peshawar' and
Students.gender is null