2009-12-09 26 views
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 

我很感激任何关于如何最好地去做这件事的帮助。我试图创建一个临时表,使用光标滚动查看每条记录,但无法获得正确的查询。

(我曾问过一个相关的问题,但我没有正确地框定问题,疯玩起来的例子还有。Need Help with queries (views) in Microsoft Access

+0

你的意思是'时间2'共有15个? – 2009-12-09 21:44:49

+0

哎呀,我的错。是的,在时间2,它是只有A + B,这是7 + 8 = 15 – 2009-12-10 18:05:14

回答

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 
+0

工程就像一个魅力!正是我在找的! – 2009-12-10 03:38:22

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 

它很可能与连接,而不是子查询来完成,并加入将liekly更有效率。但你明白了。


编辑:好的,这个问题让大脑血液流动,我不能休息,直到我解决它,让我满意。然后我回来发布最新消息,保罗已经回答了更加优秀的解决方案。 :)

这是我与(使用SQL Server)的情况下,任何人的工作SQL解决方案在乎:

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 
+0

由于垃圾箱的数量不同(有些小部件将在3箱,一些将在4,一些在10),这可能是一个问题,除非我动态地格式化内部查询。 – 2009-12-10 03:40:53

+0

是的,非常真实 - 我错过了你原来的帖子。 – 2009-12-10 06:02:57