需要帮助Microsoft Access中的查询(视图)

时间:2009-07-21 18:01:20

标签: ms-access

我有一个应用程序将记录库存中物品的箱子的重量记录到Microsoft Access表中,如下所示:

Id(AutoNumber)  Timestamp       Weight
-------------------------------------
1                Jan 1           1
2                Jan 2           1

3                Jan 3           2
4                Jan 4           2
5                Jan 5           2

6                Jan 6           3
7                Jan 7           3
8                Jan 7           3

9                Jan 8           2
10               Jan 8           2

11               Jan 9           7

12               Jan 10          4
13               Jan 10          4

请注意,体重可能每天都在变化。有时重量不会改变数天。我想输出一个报告,仅列出改变时的重量,如果重量没有改变则不重复行,如此(不需要ID字段):

Timestamp       Weight
----------------------
  Jan 1           1

  Jan 3           2

  Jan 6           3

  Jan 8           2

  Jan 9           7

  Jan 10          4

我可以使用VB或访问模块中的代码,将其写入临时表等来执行此操作。但是有没有办法只使用SQL查询(视图),包括子查询?我在想我应该能够使用GROUP By子句编写一个查询来获取'FIRST'项和另一个查询与第一个查询一起加入,但是如果没有编写一些代码,就会觉得这根本无法完成。 (此应用程序将在一个网站上 - 对于多个用户的临时表,访问权限不佳)

2 个答案:

答案 0 :(得分:0)

select o.dt, o.value from table1   o
where not exists (select top 1 t.dt, t.value from table1 t where t.dt < o.dt )
union 
select o.dt, o.value from table1   o
where exists (select top 1 t.dt, t.value from table1 t where t.dt = (o.dt - 1) and 
t.value <> o.value)

注意:我假设dt为datetime字段,value为weight字段 您可以将此查询作为基础。

希望这有帮助。

答案 1 :(得分:0)

我认为您不能使用timestamp列进行排序,因为据我所知 它没有提供密钥。给定相同netwt的多个timestamp值,例如

80001   '2009-07-22 09:28:23'   0.55
80002   '2009-07-22 09:28:23'   0.22
80003   '2009-07-22 09:28:23'   0.99

如果没有id列,您就无法知道订单。

现在id列似乎显示了顺序,但这可能是一个不安全的假设(例如,INSERT可能会显示id值,这可能是不按顺序的)。

[BTW TIMESTAMP是Access数据库引用,SQL标准SQL-92,ODBC,SQL Server Future等的保留字,因此应该避免作为数据元素名称。]

以下使用id列进行odering以确定'next'netwt值是否不同:

SELECT T3.id, T3.[timestamp], T3.netwt
  FROM table1 AS T3
 WHERE EXISTS (
               SELECT MIN(T2.id)
                 FROM table1 AS T1, table1 AS T2
                WHERE T1.id < T2.id
                      AND T1.netwt <> T2.netwt
                GROUP 
                   BY T1.id
               HAVING MIN(T2.id) = T3.id
              );