如何根据相同的最常见值填充空白字段?

时间:2012-12-12 01:12:41

标签: sql sql-server

我是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空的位置。鉴于我所展示的内容,我该怎么做?

3 个答案:

答案 0 :(得分: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 :(得分:1)

让我们分解您正在尝试做的事情。你想找到所有没有生日的student,并将他们的出生日期设置为他们批次中最常见的生日。在套装中,“最常见”被称为模式(您应该记住来自学校的“平均值,中位数和模式”)。

所以你要做的就是这样(伪代码):

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

答案 2 :(得分: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将更频繁地使用,因此查询将始终返回相同的的东西。)