2012-12-12 46 views
0

我是新来的SQL和需要一些帮助与此查询:如何根据最常见的值填充空字段?

UPDATE student 
SET s.date_of_birth= SELECT count(*) max date_of_birth 
FROM student WHERE batch =st.batch 
FROM student s, student st 
WHERE st.date_of_birth IS NULL 

所有我需要的是填补date_of_birth它是通过计算中最常见的那批date_of_birth空。鉴于我所展示的,我该如何做到这一点?

+0

看起来你有一些代码,所以你的问题是什么? (编辑:为记录,我确实看到你的代码是错误的,但能够清楚地表达你的问题是很重要的) – Colleen

回答

1

组上的日期和排序计数以获得最常见的日期:

UPDATE s 
SET s.date_of_birth = (
    SELECT top 1 date_of_birth 
    FROM student 
    WHERE batch = s.batch 
    GROUP BY date_of_birth 
    ORDER BY count(*) desc 
) 
FROM student s 
WHERE s.date_of_birth IS NULL 
1

让我们打破你想要做什么。你想找到所有没有生日的student,并将他们的出生日期设置为他们批次中最常见的出生日期。 In set“the most common”被称为模式(你应该记得学校的“平均数,中位数和模式”)。

所以你想要做的是这样的(伪):

UPDATE s 
SET s.date_of_birth = (
    SELECT mode(date_of_birthday) 
    FROM student 
    WHERE batch = s.batch 
) 
FROM student s 
WHERE s.date_of_birth IS NULL 

然而,mode是不是在SQL Server中的功能,所以我们必须创建自己获得的方式模式。那么,如果不是最高频率的项目,模式是什么?为了达到这个目的,我们只需要计算并且只抓取最大的一个:

UPDATE s 
SET s.date_of_birth = (
    SELECT TOP 1 date_of_birthday 
    FROM student 
    WHERE batch = s.batch 
    GROUP BY date_of_birthday 
    ORDER BY count(*) DESC 
) 
FROM student s 
WHERE s.date_of_birth IS NULL 
0

我明白这个问题。你试图在你的SET语句中做一个子查询,但这不是它的工作原理。如果您想要动态地执行此操作,则需要先创建子查询并确保其可行。你想从学生中选择date_of_birth,你需要计数值而不是数值本身,你想按计数对它们进行排序,而只需要结果的第一行。因此,子查询是:

select date_of_birth from student group by date_of_birth order by count(date_of_birth) desc limit 1; 

现在,你可以简单地将它放入您的更新语句来代替值:

SET s.date_of_birth=(select date_of_birth from student group by date_of_birth order by count(date_of_birth) desc limit 1) 

但值是恒定的,那么为什么运行在每次更新查询声明?首先运行该查询,获取结果,并在更新查询中使用它。 (在某些情况下,您可能希望稍后更新以基于之前更新的不同方式设置值,但在这种情况下,最常用的DOB将被更频繁地使用,因此查询将始终返回)