mysql - 如何使用存储过程从多个数据输入返回两个日期之间的数据

标签 mysql sql database stored-procedures

我们目前有一个表,每次点击字段(表示 RAG 状态)时都会创建一条新记录。目前,如果点击一次,存储的值将反射(reflect)例如红色的;如果他们再次点击,视觉效果将变为绿色,但新记录将写入表中。

例如

Field1                 Red                     Time/Date
Field1                 Green                 Time/Date

我们需要考虑如何最好地报告,认识到同一字段可能有多个行(对人们可以循环浏览的次数没有限制)以及“事件”值是什么。目前,这只能通过识别最新记录(按时间/日期)来辨别,但如果运行几天,考虑到每天可能存在多少条记录,这将使报告变得相当复杂……

我们创建了一个语句(如下),但希望数据显示在一列而不是一行中:

 select(select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 22 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 23 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 24 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 25 and Board_Metrics_ID = 1 order by Date_Created desc limit 1),
       (select Value_Colour from  SOMT_Development.Board_Metrics_Data where Metric_Year = 2018 and Metric_Month = 3 and Metric_Day = 26 and Board_Metrics_ID = 1 order by Date_Created desc limit 1);

我们还需要将其作为两个日期之间的存储过程,以便我们可以轻松更改日期(例如2018年3月23日 - 2018年3月29日)。

谢谢

最佳答案

您似乎想要给定指标每天的最后一条记录。您可以使用相关子查询来完成此操作:

select bmd.*
from SOMT_Development.Board_Metrics_Data bmd
where bmd.Metric_Year = 2018 and Metric_Month = 3 and
      bmd.Metric_Day in (26, 27, 28) and bmd.Board_Metrics_ID = 1 and
      bmd.Date_Created = (select max(bmd2.Date_Created)
                          from SOMT_Development.Board_Metrics_Data bmd2
                          where bmd2.Board_Metrics_ID = bmd.Board_Metrics_ID and
                                bmd2.Metric_Year = bmd.Metric_Year and
                                bmd2.Metric_Month = bmd.Metric_Month and
                                bmd2.Metric_Day = bmd.Metric_Day
                         );

此子查询可以利用 Board_Metrics_Data(Metric_Year, Metric_Month, Metric_Day, Metrics_ID, Date_Created) 上的索引。

编辑:

对于任意范围的日期:

select bmd.*
from SOMT_Development.Board_Metrics_Data bmd
where bmd.Date_Created >= @start_date and bmd.Date_Created < @end_date and
      bmd.Board_Metrics_ID = 1 and
      bmd.Date_Created = (select max(bmd2.Date_Created)
                          from SOMT_Development.Board_Metrics_Data bmd2
                          where bmd2.Board_Metrics_ID = bmd.Board_Metrics_ID and
                                date(bmd2.Date_Created) = date(bmd.Date_Created)
                         );

此版本的查询有点难以优化。

关于mysql - 如何使用存储过程从多个数据输入返回两个日期之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630636/

相关文章:

mysql - mysql触发器定义中的if语句

php - MySQL 统计并显示某个范围内的所有日期

java - 如何将一组允许值中的字符串参数传递给函数

Mysql优化-每个用户存储大量数据

java - type2 的 mysql 数据库的驱动程序名称和 url 是什么

php - Laravel belongsTo() 列命名问题

c# - 获取插入值的主键

mysql - SQL Like 不带 _

android - 如何在 android 中有两个用于调试和生产的 Firebase (Firestore) 数据库?

database - Cassandra适合需要频繁查询(读/写)的系统吗?