0

我正在构建一个应用程序

我的 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 个不同的城市 卡拉奇、伊斯兰堡、白沙瓦、卡拉奇

从白沙瓦收集的学生数据没有设置 Gender 属性,因此在整个表中,来自白沙瓦的学生的 Gender 列不包含任何值。

我的主管要求我通过关联规则填写表格的这一部分,即大多数学生的名字在整个表格中非常相似,如果有一个特定的名字,比如“USMAN”,那么总共有 100 个像 USMAN 这样的名字表,无论他们来自哪个城市,如果 60 USMAN 行的性别为 MALE,那么补丁中白沙瓦为城市且学生姓名为 Usman 的任何行我应该将其性别设置为男性

我希望我已经明确了我的问题我正在尝试通过一些 sql 查询来完成这项工作,如果有人可以帮助我,我将非常感谢

4

1 回答 1

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

接下来,您需要查看结果并设置截止值。具有特定名称的单个男学生或女学生不能令人信服地认为该名称指定了性别。因此,假设您需要至少 5 个示例和 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
于 2012-12-18T16:35:31.477 回答