【问题标题】:MS Access SQL If Row(n) = Row(n-1)MS Access SQL If Row(n) = Row(n-1)
【发布时间】:2018-07-26 10:24:32
【问题描述】:

我正在开发一个访问数据库,在其中一个表输入中,由于使用了一些旧软件,重复项经常出现在(我最终想要的)主键中,原因如下所示:

ID |   Fluid      |   Designer   |   Team        |
--------------------------------------------------
A  |   Water      |   John       |   Piping      |
A  |   Water      |   James      |   Piping      |
B  |   Steam      |   Sam        |   Piping      |
B  |   Steam      |   Sam        |   Modeling    |
C  |   Hydrogen   |   Joe        |   Piping      |
D  |   Steam      |   Joe        |   Piping      |

参考 ID 字段的重复查询产生:

ID |   Fluid      |   Designer   |   Team        |
--------------------------------------------------
A  |   Water      |   John       |   Piping      |
A  |   Water      |   James      |   Piping      |
B  |   Steam      |   Sam        |   Piping      |
B  |   Steam      |   Sam        |   Modeling    |

不希望自动删除这些重复项,因为重要的是要知道软件模型更改了设计者或转移到了另一个团队。因此,这些都是人工审核的。

但是,此表可以包含多达 30 个字段,并且查找单个非重复项可能会很麻烦。因此,我想要的输出是:

ID |   Fluid      |   Designer   |   Team        |
--------------------------------------------------
A  |              |   John       |               |
A  |              |   James      |               |
B  |              |              |   Piping      |
B  |              |              |   Modeling    |

我对 SQL 的经验很少,但我用了一些时间使用 Visual Basic,所以我的猜测是一些标准,例如:

if(record(n)=record(n-1), display("")

但是,从我对 access 和 SQL 的基本了解来看,我知道将 Visual Basic 关联起来是一个苹果与橘子的比较。

我正在运行 MS Access 2007-2010。


编辑: 现在研究标准化(抱歉,我是初学者)。尽管关于我的数据库问题的更多细节。还更新了上面的决赛桌。

我认为我的数据库应该如何工作:

  1. 从软件导入数据(每天)。这产生了表 1。
  2. 使用重复查询查找 ID 列中的任何重复项。这是表 2。
  3. 使用查询生成一个表,该表将显示重复的 ID 以及重复的相应列。

软件中的错误源于它会将新数据修改为预先存在的数据,但仅删除完全重复的数据。如果说,不同的用户在模型上工作,那么它不会更新当前 ID,而是添加一个新行,其中所有详细信息都相同,但不同的用户除外。

【问题讨论】:

  • 你应该规范你的数据库。这是冗余,对你不利。
  • 我建议先normalising 你的数据。我最初认为 IDFluid 的标识符,但 SteamIDB & D。我会将 FluidDesignerTeam 拆分到各自的表中,这样就不会出现数据重复。
  • Steam 不会有 SamJoe 作为你的决赛桌设计师,或者只是基于重复ID?当您说 30 个字段 时,您的意思是(在谈论数据库时讨厌这样说)30 列
  • @DarrenBartrup-Cook 是的,我的意思是 30 列。更新了我的帖子以(希望)更有帮助。我在更新的最后一张表中也犯了一个错误。感谢您到目前为止的回复,我正在研究规范化。

标签: database ms-access jet-sql


【解决方案1】:

条件格式

听起来您正在寻找一种简单的方法,可以直观地发现相似记录中一长列列中的(少数)差异。几年前我做过一个非常相似的项目,它生成了一份报告来查看用户对其个人资料所做的更改。我接近它的方法是使用Conditional Formatting 突出显示不同的字段。

在您的比较报告中,我还将按ID 列和group header 进行分组,以便在各组之间进行简单的视觉分隔。

对于报告中的比较公式,您可以比较组中字段的Min()Max() 值。如果最小值和最大值相同,则字段在组中匹配。如果没有,您可以使用条件格式突出显示该字段。

我想如果你想变得更花哨,你可以扩展这个表达式以使用 running sum 来仅突出显示第二条记录中的变化。

隐藏重复值

另一种方法是hide the duplicate values 以获取组中的后续记录。这将涉及相同的分组概念,但在报告中您将字段上的Hide Duplicates 属性设置为True。采用这种方法,您会在列表顶部看到一条完整的记录,但随后记录的字段只会在值更改时显示。

【讨论】:

  • 太棒了,这真的很有帮助。非常感谢。
猜你喜欢
  • 2021-03-25
  • 2021-10-08
  • 2021-11-16
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2023-02-16
  • 1970-01-01
相关资源
最近更新 更多