比较 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 中的“连续”行的主要内容,如果未能解决你的问题,请参考以下文章

循环访问 MS Access 中的连续记录

解决 Ms Access 连续表格?

如何根据每条记录的连续表单中 ms-access 中的其他值填充文本框上的值

MS Access 2007 连续表格备用背景颜色屏幕损坏

在 MS Access 中创建存储过程?

MS-Access 中的未嵌套行?