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