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;

これで、値の代わりにそれをupdateステートメントに入れることができます。

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 に答える