Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用于存储和计算历史数据的数据库问题_Mysql_Database Design_Stored Procedures_Cursor - Fatal编程技术网

Mysql 用于存储和计算历史数据的数据库问题

Mysql 用于存储和计算历史数据的数据库问题,mysql,database-design,stored-procedures,cursor,Mysql,Database Design,Stored Procedures,Cursor,我有一个应用程序,在不同的时间轮询不同的箱子,并根据重量计算每个箱子中的小部件数量。轮询每隔几分钟进行一次,结果被加上时间戳并添加到MySQL表中。该表包含以下3列。该示例显示了3个存储箱(A、B和C),但同一小部件可能有1到10个存储箱。(小部件可能仅在1或2个箱子中,而大部件可能占用更多箱子) 应用程序需要生成“库存历史记录”报告-这将涉及在每个时间步计算在该时间步的所有箱子中的项目总数。对于本例,报告将只包含下面的timestamp列和CountHistory列(最后一列)(显示其他列只是

我有一个应用程序,在不同的时间轮询不同的箱子,并根据重量计算每个箱子中的小部件数量。轮询每隔几分钟进行一次,结果被加上时间戳并添加到MySQL表中。该表包含以下3列。该示例显示了3个存储箱(A、B和C),但同一小部件可能有1到10个存储箱。(小部件可能仅在1或2个箱子中,而大部件可能占用更多箱子)

应用程序需要生成“库存历史记录”报告-这将涉及在每个时间步计算在该时间步的所有箱子中的项目总数。对于本例,报告将只包含下面的timestamp列和CountHistory列(最后一列)(显示其他列只是为了显示计算)

在时间1时,A已被轮询,并有8个小部件。B和C还没有被调查。所以总数是8

在时间2,B已经被轮询,并且有7个小部件。总数是17

在时间3,C已经被轮询,并且有4个小部件。总数是19

在时间4,A再次轮询,并且只有一个小部件。所以总数现在是1+4+7=12

…等等

timestamp   bin Widget_     A   B   C   CountHistory
                Count                    (stock flow)
--------------------------------------------------------
1           A       8       8   0   0       8
2           B       7       8   7   0       15
3           C       4       8   7   4       19
4           A       1       1   7   4       12
5           B       3       1   3   4       8
6           C       5       1   3   5       9
7           A       6       6   3   5       14
8           B       7       6   7   5       18
9           C       2       6   7   2       15
如果你能帮我解决这个问题,我将不胜感激。我试图创建一个临时表,使用光标滚动每个记录,但无法获得正确的查询

(我以前问过一个相关的问题,但我没有正确地提出这个问题,也没有把示例搞糟。)

如果没有实际的模型(DDL)和数据(包括预期的输出),我不确定是否会尝试提供实际的、语法检查过的示例SQL。虽然我确实认为这在应用程序代码中或使用游标很容易做到,但我认为这可以在单个查询中完成

也就是说,它是这样的——考虑一下这个100%伪代码:

SELECT
 timestamp,
 bin,
 widget_count,
 (SELECT A that is most recent and <= current row's timestamp) A,
 (SELECT B that is most recent and <= current row's timestamp) B,
 (SELECT C that is most recent and <= current row's timestamp) C,
 (SELECT sum of last three columns) CountHistory
FROM
 widget_bin_table
选择
时间戳,
箱子
你的计数,
(选择一个最新的且没有实际模型(DDL)和数据(包括预期输出)的示例SQL,我不确定是否会尝试提供实际的、经过语法检查的示例SQL。尽管我确实认为这在应用程序代码中或使用游标很容易做到,但我认为可以在单个查询中完成

也就是说,它是这样的——考虑一下这个100%伪代码:

SELECT
 timestamp,
 bin,
 widget_count,
 (SELECT A that is most recent and <= current row's timestamp) A,
 (SELECT B that is most recent and <= current row's timestamp) B,
 (SELECT C that is most recent and <= current row's timestamp) C,
 (SELECT sum of last three columns) CountHistory
FROM
 widget_bin_table
选择
时间戳,
箱子
你的计数,

(选择一个最近的,我想这会满足您的需要。内部查询会找到最近的时间戳,在该时间戳处每个箱子都被更改了

SELECT m.timestamp, SUM(w.Widget_Count) AS CountHistory
FROM (
    SELECT a.timestamp, b.bin, MAX(b.timestamp) AS intMostRecentTimestamp
    FROM WidgetTable a
        CROSS JOIN WidgetTable b
    WHERE a.timestamp >= b.timestamp
    GROUP BY a.timestamp, b.bin, a.Widget_Count
) m 
    INNER JOIN WidgetTable w ON m.intMostRecentTimestamp = w.timestamp
GROUP BY m.timestamp
ORDER BY m.timestamp

我认为这将满足您的需要。内部查询将查找每个bin为每个时间戳更改的最新时间戳

SELECT m.timestamp, SUM(w.Widget_Count) AS CountHistory
FROM (
    SELECT a.timestamp, b.bin, MAX(b.timestamp) AS intMostRecentTimestamp
    FROM WidgetTable a
        CROSS JOIN WidgetTable b
    WHERE a.timestamp >= b.timestamp
    GROUP BY a.timestamp, b.bin, a.Widget_Count
) m 
    INNER JOIN WidgetTable w ON m.intMostRecentTimestamp = w.timestamp
GROUP BY m.timestamp
ORDER BY m.timestamp

你的意思是“时间2”总共有15个?哎呀,我的错。是的,时间2只有a+B,这是7+8=15。你的意思是“时间2”总共有15个?哎呀,我的错。是的,时间2只有a+B,这是7+8=15,这就像一个符咒!就像我在找的一样!就像一个符咒!就像我在找的一样!因为箱子的数量不同(有些小部件将放在3个箱子里,有些将放在4个箱子里,有些将放在10个箱子里)除非我动态格式化内部查询,否则这可能是个问题。是的,非常正确——我在你的原始帖子中遗漏了这一点。因为箱子的数量不同(有些小部件将放在3个箱子里,有些将放在4个箱子里,有些放在10个箱子里)这可能是一个问题,除非我动态格式化内部查询。是的,非常正确——我在你最初的帖子中遗漏了这一点。