0

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

timestamp   bin Widget_Count
--------------------------
1           A       8
2           B       7
3           C       4
4           A       1
5           B       3
6           C       5
7           A       6
8           B       7
9           C       2

应用程序需要生成一个“库存历史”报告——这将涉及在每个时间步计算总数是多少。在该时间步来自所有箱的项目。对于此示例,报告将仅包含时间戳列和下方的 CountHistory 列(最后一列)(显示其他列只是为了显示计算)

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

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

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

在时间 4,A 再次轮询并且只有 1 个小部件。所以现在总数是 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

对于如何最好地解决这个问题,我将不胜感激。我试图创建一个临时表,使用游标滚动浏览每条记录,但无法获得正确的查询。

(我之前曾问过一个相关问题,但我没有正确地提出问题并弄错了示例。需要 Microsoft Access 中查询(视图)的帮助

4

2 回答 2

2

我认为这将满足您的需求。内部查询查找每个 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
于 2009-12-09T22:18:52.863 回答
1

如果没有实际模型 (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

它可能可以通过连接而不是子查询来完成,并且连接可能会更有效。但你明白了。


编辑:好的,这个问题让大脑血流成河,直到我满意地解决它,我才能休息。然后我回来发布更新,保罗已经回答了一个更优雅的解决方案。:)

如果有人关心,这是我使用 SQL(使用 SQL Server)的解决方案:

SELECT
    timestamp, bin, widget_count, A, B, C, A + B + C CountHistory
FROM
    (
     SELECT
        wb.timestamp,
        wb.bin,
        wb.widget_count,
        ISNULL((SELECT TOP 1 widget_count FROM widget_bin wb1 WHERE wb1.bin = 'A' 
                AND wb1.timestamp <= wb.timestamp ORDER BY wb1.timestamp DESC), 0) A,
        ISNULL((SELECT TOP 1 widget_count FROM widget_bin wb1 WHERE wb1.bin = 'B' 
                AND wb1.timestamp <= wb.timestamp ORDER BY wb1.timestamp DESC), 0) B,
        ISNULL((SELECT TOP 1 widget_count FROM widget_bin wb1 WHERE wb1.bin = 'C' 
                AND wb1.timestamp <= wb.timestamp ORDER BY wb1.timestamp DESC), 0) C
     FROM
        widget_bin wb
    ) sub
于 2009-12-09T21:52:57.817 回答