次のようなmysqlのテーブルがあります。
5 分単位で集計したいので、次のような手順を作成します。
ただし、student_score が変更された場合 (別のフィールドを追加するなど)、手順を更新する必要があります。student_score テーブルに数百のフィールドがある場合、"avg(src.score) as score" のような手順で数百の割り当てを記述する必要があります。
私の質問は次のとおりです。プロシージャをソーステーブルに自己適応させる方法はありますか。
次のようなmysqlのテーブルがあります。
5 分単位で集計したいので、次のような手順を作成します。
ただし、student_score が変更された場合 (別のフィールドを追加するなど)、手順を更新する必要があります。student_score テーブルに数百のフィールドがある場合、"avg(src.score) as score" のような手順で数百の割り当てを記述する必要があります。
私の質問は次のとおりです。プロシージャをソーステーブルに自己適応させる方法はありますか。
新しいタイプのスコアごとに新しい列を追加することは想定していません。特に数百のフィールドについて話している場合は、DB 設計が正しくない可能性が高くなります。より良い代替手段は、次のようなテーブルを用意することです。
studentId 、ScoreTypeID、時間、スコア
このテーブルでは、学生ごとにスコア タイプごとに 1 つの行があり、上記のクエリは静的になります。
「プロシージャ」についての言及は、データベース サーバー上の何らかのストアド プロシージャを示唆していますが、アプリケーション コードまたはそれが作成する SQL クエリの一部を参照しているだけだと思いますよね?
所定の時間内の 5 分ごとのデータの平均でも、平均化について説明しています。そこでの回答に書いたように、次を使用してこれを達成します
group by time div 500
avg
列ごとに式を複製する必要があることについて、3 つの解決策があります。
別のテーブルをまったく作成せず、実際にこれらの平均値にアクセスするすべてのクエリで平均化を行うだけです。これらのクエリがすべての列のサブセットのみを使用する場合は、それらに名前を付けて平均化するだけで済みます。
2 番目の解決策は、挿入クエリをプログラムで生成することです。つまり、これらのクエリを送信するアプリケーションで、テーブル内の列についてデータベースにクエリを実行するコードを作成し、一致するクエリを作成します。これは、実際のテーブル (つまり、insert ステートメント) またはビュー (つまり、create view ステートメント) の両方に使用できます。
第三に、スコアがすべて同様の意味を持つ場合、これらの複数の列が複数の行に変換され、名前、時間、種類、およびスコアの列が含まれ、種類の列がいくつかの (おそらく列挙型) さまざまな種類のスコアを区別するために使用される値。
student_score
テーブルが変更された場合、テーブルstudent_score_5m
と手順も変更する必要があります。右?ただし、データベースの設計は頻繁に変更しないでください。INSERT...SELECT ステートメントと同じようにすべてのフィールドを指定します。
5 分間隔でグループ化するには、次のクエリを試してください -
SELECT
DATE(time) + INTERVAL (TIME_TO_SEC(TIME(time)) DIV 300) * 300 SECOND date,
SUM(score)
FROM
table
GROUP BY
date