【问题标题】:Dynamically Control SQL Select Based on Time Stamps from other Table根据来自其他表的时间戳动态控制 SQL 选择
【发布时间】:2017-05-31 12:24:54
【问题描述】:

我有什么

所以我在 MySQL 中有一个 SQL 表,其中的数据基于最终用户/操作员在开始运行批处理之前在设备上输入的内容,以在他们运行容器之前设置容器的大小过程。

这是一台工业机器,可以根据操作员的设置向容器中填充 x 数量的产品,并且在这个级别上工作得很好,可以控制每个容器中倾倒的数量。


新的报告需求

现在需要报告任何给定日期的平均值等数据,这也很好,但有时表中指示当天运行的容器大小的数据不会改变,如果他们运行相同大小的容器数天;这也很好,因为我可以使用 SELECT Value FROM Table ORDER BY TimeStr DESC LIMIT 1 之类的东西从表中获取指示容器大小设置的最新值。


问题

当此表在一天中的值发生变化时,我无法确定如何处理,并且无法动态计算出自该值更改之前和该值之后以来每个容器的平均值。记录来自传感器的集装箱重量和最终用户/操作员设置的集装箱尺寸的表格也都有日期时间戳。


SQL 存储过程

下面是我到目前为止设置的存储过程,只是为了进行一些快速测试以确认它按预期工作,然后我将通过和微调等,但我很快把它放在一起至少确认我可以让它在 SQL 级别从 SP 按预期工作。

delimiter $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
SET @CurrDate = CONCAT(CURDATE(),'%');

SET @CheckIt = (SELECT COUNT(*) FROM SL.ContainerOzBit
    WHERE TimeStr LIKE @CurrDate ORDER BY TimeStr DESC);

IF(@CheckIt = 0) THEN 
    SET @GramAvg = (SELECT AVG(Value) FROM SL.RTSensorWeight
    WHERE iQuality = 3 AND Value != 0 AND TimeStr LIKE @CurrDate);
    SET @CanSize = (SELECT CASE Value 
        WHEN 0 THEN '15' 
        WHEN 1 THEN '21'
        WHEN 2 THEN '12'
        WHEN 3 THEN '17'
        WHEN 4 THEN '17' 
    ELSE NULL END as CanSize
    FROM SL.ContainerOzBit
    WHERE IQuality = 3 ORDER BY TimeStr DESC LIMIT 1);

SET @CanSizeSetTime = (SELECT TimeStr FROM SL.ContainerOzBit WHERE IQuality = 3 ORDER BY TimeStr DESC LIMIT 1);
SET @Downtime = (SELECT Downtime FROM SL._trackingdowntime WHERE Date LIKE @CurrDate);
SELECT ROUND(@GramAvg * 0.03527396195, 2) AS OzAvg, ROUND(@GramAvg, 2) AS GramAvg, 
    @CanSize AS CanSize_Set, @CanSizeSetTime AS CanSize_SetTime, @Downtime AS Downtime;

ELSE 

    <I need to put query here to help get average but split up between the time of the change>

END IF;

END$$

回顾澄清

  • 所以有两个表:
    • 一个记录容器的大小,应该是 根据操作员运行,每次设置时都会将一个新值添加到带有时间戳的表中(见下文)
    • 另一个记录每个容器的重量(以克为单位),因为它通过一个称重每个重量的传感器,每个重量都记录到另一个带有时间戳的表中

因此,如果他们整天运行 21 盎司容器,而我在一天结束时发送报告,那么这会很好,因为我们知道全天的平均值是准确的,因为相同大小的容器已经运行了一整天长。

如果他们在一天的前三个小时内运行 21 盎司容器,然后在之后的某个时间,我看到表中的值发生了变化,表明他们在上午 11:30 开始运行 15 盎司罐头,这就是我如果使用 MySQL 甚至可以找出或编写一个可以从上午 8 点到上午 11:30 运行 21 Oz 容器然后从上午 11:30 到下午 5:00 运行的查询,我会卡住下一步他们正在运行 15 Oz 容器,然后构建逻辑以显示这两个容器的平均值等。

在我提供的存储过程中,ELSE 之后是我不知道如何继续的地方。

当操作员确实更改了更新表的机器上的值时,由于某种原因使事情变得更糟,它将使用所有值更新表,直到设置的最后一个值应该是指示容器的值批量运行的重量(下面的示例)。如果该值已更改,并且自上次更改后还没有过去 10 秒,那么我什至不需要查看。

如果我忽略了这一点,或者让它变得比它需要的更复杂,我不会感到惊讶,因此任何建议或指导都会被试一试。我只需要能够向他们展示他们当天的平均值

【问题讨论】:

  • SELECT Value FROM Table where TimeStr 之前的最年轻的容器大小更改?

标签: mysql


【解决方案1】:

这应该完成您的大部分工作,同时为您提供当时的价值和罐头尺寸:

SELECT r.TimeStr, r.Value, (SELECT CASE Value 
    WHEN 0 THEN '15' 
    WHEN 1 THEN '21'
    WHEN 2 THEN '12'
    WHEN 3 THEN '17'
    WHEN 4 THEN '17' 
ELSE NULL END  FROM ContainerOzBit 
     WHERE TimeStr < r.TimeStr 
       ORDER BY TimeStr DESC LIMIT 1) as CanSize,
(SELECT TimeStr  FROM ContainerOzBit 
     WHERE TimeStr < r.TimeStr 
       ORDER BY TimeStr DESC LIMIT 1) as LastCanSizeChange
FROM RTSensorWeight r;

Resultig(在我的演示数据上):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2015-05-28
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2012-03-08
    相关资源
    最近更新 更多