Mysql 用于存储和计算历史数据的数据库问题
我有一个应用程序,在不同的时间轮询不同的箱子,并根据重量计算每个箱子中的小部件数量。轮询每隔几分钟进行一次,结果被加上时间戳并添加到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 …等等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列(最后一列)(显示其他列只是
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个箱子里)这可能是一个问题,除非我动态格式化内部查询。是的,非常正确——我在你最初的帖子中遗漏了这一点。