通过特定的表记录值进行迭代,以用于从另一个表中过滤查询

时间:2017-12-16 00:58:00

标签: mysql sql

有一个名为 Tbl 的临时表,它是根据查询创建的(可能与知道无关)在任何特定日期运行,但通常只是当前日期(CURDATE()),其中 始终只有两个BatNum(批号)记录 ,其中最早的TimeStr将是开始时间和最新TimeStr将是每个BatNum的结束时间。

这些是我们开始的记录,所以这里没有问题,但这是我们从其他表中获得的所有内容。虽然在我提供的这个小例子中有三组不同的BatNum记录(1,2,3),但可能只有1或最多可能有30个。

  

Tbl表

     

enter image description here

           

Tbl Explained

     

enter image description here

My SQL Fiddle

我在这里使用Weight表中的一小部分数据样本创建SQL Fiddle,我在原始SQL 中添加了一些更大的数据样本部分也是以防万一。

这些只是按照特定范围记录的Weights表格中的数据样本缩小,但对于给定的批次(即每个BatNum组,它可能是50,000,25,000等) )。

我的问题

我把这个逻辑放到一个存储过程中,如果这对于 MySQL 来说是重要的。

  • 我正试图从Tbl表中为每个TimeStr分组(总是两个)的两个BatNum值记录中的每一个进行尝试,使用它们来获取记录从Weight表中,然后将所有数据(每个分组)与各种函数等聚合在一起,以获得所需的任何记录。

我的想法(呃噢...... spaghettios)

我不确定是否可以动态创建@StartTime@EndTime变量,并从每个BatNumTimeStr值中迭代其值然后在MySQL中使用另一个查询等。

  • 例如,我可以使用此类过滤( WHERE TimeStr BETWEEN @StartTime AND @EndTime )和每个BatNum组(例如三个)运行查询)将每个查询中的@StartTime@EndTime值设置为每个TimeStr组的BatNum值 - 但我可以使用MIN(TimeStr),{{1或者可能MAX(TimeStr)知道哪个是开始,哪个是相应的结束。

为了给您一个想法,一个示例来自ORDER BY TimeStr [ASC/DESC] LIMIT 1的每个BatNum组的迭代值是:

  

来自BatNum = 1条记录(迭代1)

     
      
  • Tbl
  •   
  • SET @StartTime = '2017-12-14 06:12:31';
  •   
  • SET @EndTime = '2017-12-14 07:45:55';
  •   
     

来自BatNum = 2条记录(迭代2)

     
      
  • SET @val = 15;
  •   
  • SET @StartTime = '2017-12-14 07:45:56';
  •   
  • SET @EndTime = '2017-12-14 12:15:51';
  •   
     

来自BatNum = 3条记录(迭代3)

     
      
  • SET @val = 12;
  •   
  • SET @StartTime = '2017-12-14 12:15:52';
  •   
  • SET @EndTime = '2017-12-14 16:20:58';
  •   

最后,我可能需要使用类似的东西:

SET @val       = 15;

我只是不确定如何最好地处理SELECT @Val oz , COUNT(Value) count , AVG(Value) average , STDDEV(Value) stddev FROM Weights WHERE TimeStr BETWEEN @StartTime AND @EndTime; 表中每个BatNum组的记录的迭代,所以我想我会寻求帮助。

不要忘记:

原始SQL

Tbl

1 个答案:

答案 0 :(得分:1)

我认为您不需要存储过程,但您需要一个(或多个)视图或临时表,其中批量编号和重量(oz)与权重表中的权重相关联。完成后,您可以从该视图创建任何类型的聚合值。

以下是为您提供临时表的查询。

SELECT p.`Value`, q.BatNum, q.Value oz
FROM `weights` p
LEFT JOIN 
  (SELECT a.BatNum BatNum, a.TimeStr sTime, b.TimeStr eTime, a.value Value
   FROM Tbl a
   LEFT JOIN Tbl b ON (a.BatNum = b.BatNum)
   WHERE a.TimeStr < b.TimeStr) q 
  ON (p.`TimeStr` BETWEEN q.sTime and q.eTime)

这应该为您提供如下输出:

Value     BatNum    oz
431       1         15
431.2     1         15
...  
....
352.8     2         12
352.4     2         12
......
.....
427.3     3         15
427.1     3         15
.....
.....

从上面的表格或视图中,您可以创建最终查询,例如

SELECT oz, count(value), avg(value)
FROM createdView
GROUP BY BatNum

如果您使用的是mysql,那么创建视图比直接从此处复制查询需要更多的努力。在从大数据生成更快结果的情况下,您可能还需要优化查询。