比较 Ms Access 中的“连续”行
Posted
技术标签:
【中文标题】比较 Ms Access 中的“连续”行【英文标题】:Comparing "Consecutive" Rows in Ms Access 【发布时间】:2012-03-27 12:56:19 【问题描述】:我有一张如下所示的表格:
ID Subid Time Value Value2
1 1 3 100 2
1 1 4 100 2
2 2 3 200 1
2 2 4 200 2
4 4 4 10 4
5 6 3 10 2
5 6 4 12 2
我现在要做的只是显示从时间 3 到时间 4 存在差异的条目。所以结果应该如下所示:
ID Subid Time Value Value2
2 2 3 200 1
2 2 4 200 2
4 4 4 10 4
5 6 3 10 2
5 6 4 12 2
进入第二部分的条件如下: 如果有两个条目具有相同的 ID 和 Subid,但月份不同,则检查 value 和 value2 是否相等。如果两者都相等,则删除该条目,否则显示该条目。 如果在其他时间找不到匹配项,则也显示该条目。 通常这个表会有很多匹配的条目,所以我想通过整理这些来让我的生活更轻松。
我必须使用 MS Access (2010) 来执行此操作。
感谢您的帮助。
在雷穆回答后编辑:
我现在遇到的问题是我实际上并没有上面显示的表格,而是使用另一个查询创建它。所以现在我只是将创建该表的查询放在 Remou 使用它的四个地方......我确信有更好的方法来做到这一点,但我想不出来......
SELECT t2.*
来自 (选择 t.ID、t.SubID、t.Time、t.Value、t.value2、t.value 来自
( 巨大的选择在这里有 3 个连接)t
WHERE t.Time=4) AS t2
LEFT JOIN
(SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value
FROM
( 巨大的选择在这里有 3 个连接)t
WHERE t.Time=3) AS t1
ON t2.Id = t1.Id
WHERE t2.value<>t1.value
OR t2.value2<>t1.value2
OR t1.Id Is Null
联合所有
SELECT t1.* FROM
(SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value
FROM
( 巨大的选择在这里有 3 个连接)t
WHERE t.Time=3) AS t1
LEFT JOIN
(SELECT t.ID, t.SubID, t.Time, t.Value, t.value2, t.value
FROM
( 巨大的选择在这里有 3 个连接)t
WHERE t.Time=4) AS t2
ON t1.Id=t2.Id
WHERE t1.value<>t2.value
OR t1.value2<>t2.value2
OR t2.Id Is Null
ORDER BY Id, EntryNo;
【问题讨论】:
这真的很难。它只适用于分析功能,我不确定,它在 MS Access 中可用。 遗憾的是,这是 MS Access 一直缺少的一项功能,如果可以的话,您最好在 Excel 中比较连续的行。 嗨。不幸的是,我不能在 Excel 中真正做到这一点。 【参考方案1】:怎么样:
SELECT t2.*
FROM (SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=4) AS t2 LEFT JOIN (SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=3) AS t1 ON t2.ID = t1.ID
WHERE t2.Value<>t1.Value
OR t2.Value2<>t1.Value2
OR t1.ID Is Null
UNION ALL
SELECT t1.* FROM
(SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=3) t1
LEFT JOIN
(SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM Test2 t
WHERE t.Time=4) t2
ON t1.ID=t2.ID
WHERE t1.Value <> t2.Value
OR t1.Value2 <> t2.Value2
OR t2.ID Is Null
ORDER BY ID
【讨论】:
嗨 Remou,非常感谢您的询问。我现在设法做到了。到目前为止,这是一个非常“丑陋”的查询,我希望能在改进它方面提供一些帮助。我会更新原来的问题。【参考方案2】:由于这是 MS Access,如何使用 t 的两个副本创建一个查询(Access 调用第二个 t_1)(只需连接每个字段,或查看此http://i49.tinypic.com/rix175.jpg。)
然后右键单击,编辑 SQL,你应该会看到如下内容:
SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM t INNER JOIN t AS t_1 ON (t.Value2 = t_1.Value2)
AND (t.Value = t_1.Value)
AND (t.Subid = t_1.Subid)
AND (t.Time = t_1.Time-1)
AND (t.ID = t_1.ID);
你可以这样重写:
SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM t INNER JOIN t AS t_1 ON
(t.Time = t_1.Time-1)
AND (t.ID = t_1.ID)
AND (t.Subid = t_1.Subid)
AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2));
注意“t.Time = t_1.Time-1”编辑和AND语句;这将为您提供 Time = 3 的查询结果。现在对此进行 UNION,稍作修改,这次使用“t.Time-1 = t_1.Time”而不是获得 Time = 4 结果。然后在末尾添加一个以捕获唯一条目:
SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM t INNER JOIN t AS t_1 ON
(t.Time = t_1.Time-1)
AND (t.ID = t_1.ID)
AND (t.Subid = t_1.Subid)
AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2))
UNION SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM t INNER JOIN t AS t_1 ON
(t.Time-1 = t_1.Time)
AND (t.ID = t_1.ID)
AND (t.Subid = t_1.Subid)
AND ((t.Value <> t_1.Value) OR (t.Value2 <> t_1.Value2))
UNION SELECT t.ID, t.Subid, t.Time, t.Value, t.Value2
FROM t INNER JOIN t AS t_1 ON
(t.Time-1 = t_1.Time)
AND (t.ID <> t_1.ID)
AND (t.Subid <> t_1.Subid);
【讨论】:
以上是关于比较 Ms Access 中的“连续”行的主要内容,如果未能解决你的问题,请参考以下文章