0

我在mysql中有一个这样的表:

在此处输入图像描述

我想聚合 5 分钟,所以我创建了一个这样的过程:

在此处输入图像描述

但是,如果 student_score 发生变化(例如添加另一个字段),则需要更新程序。如果 student_score 表有数百个字段,则需要在“avg(src.score) as score”之类的过程中写入数百个作业

我的问题是:有没有办法让程序自适应源表。

4

3 回答 3

2

您不应该为每种新类型的分数添加新列,这很可能是不正确的数据库设计,特别是如果您谈论数百个字段,更好的选择是有一个像这样的表

studentId , ScoreTypeID, 时间, 分数

在此表中,每个分数类型的每个学生都有一行,上面的查询将是静态的

于 2012-09-12T09:33:17.323 回答
1

你提到的“过程”暗示了数据库服务器上的某种存储过程,但我认为你只是指一段应用程序代码或它创建的 SQL 查询,对吧?

如何以 5 分钟的间隔聚合

给定时间内每 5 分钟的数据平均值也讨论了平均值。正如我在我的回答中写的那样,我会使用

group by time div 500

如何处理多个分数列

关于必须avg为每一列复制表达式,我看到了三个解决方案。

一种方法是根本不创建单独的表,而是简单地在您实际访问这些平均值的每个查询中进行平均。如果这些查询仅使用所有列的子集,那么您只需命名并平均这些列。

第二种解决方案是以编程方式生成插入查询。即在您发送这些查询的应用程序中,有一段代码查询有关表中列的数据库,并构造要匹配的查询。您可以将它用于真实表(即插入语句)或视图(即创建视图语句)。

第三,如果你的分数都具有相似的含义,你最好规范化你的表,使这些多列变成多行,列名称、时间、种类和分数,其中种类列是一些(可能是枚举)用于区分不同类型分数的值。

于 2012-09-12T09:50:28.703 回答
0

如果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
于 2012-09-12T09:45:39.790 回答