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鉴于我所展示的,我该怎么做?

4

3 回答 3

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
于 2012-12-12T01:20:22.510 回答
1

让我们分解你想要做的事情。您想找到所有student没有出生日期的 s,并将他们的出生日期设置为他们批次中最常见的出生日期。在集合中,“最常见的”被称为众数(你应该记住学校里的“平均值、中位数和众数”)。

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

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
于 2012-12-12T01:22:28.980 回答
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 将被更频繁地使用,因此查询将始终返回相同的内容。)

于 2012-12-12T01:28:15.157 回答