我有一个应用程序将记录库存中物品的箱子的重量记录到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'项和另一个查询与第一个查询一起加入,但是如果没有编写一些代码,就会觉得这根本无法完成。 (此应用程序将在一个网站上 - 对于多个用户的临时表,访问权限不佳)
答案 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
);