获取先前记录的总数

Posted

技术标签:

【中文标题】获取先前记录的总数【英文标题】:Get the total number of previous records 【发布时间】:2014-05-05 06:07:43 【问题描述】:

我正在 MS Access 中创建一个查询,该查询需要使用以前记录的总数更新新创建的字段。像这样的:

原表:

|  ID | Name |
--------------
|  1  | Mark |
--------------
|  2  | Mich |
--------------
|  3  | Isak |
--------------

现在我添加另一列(int 类型),例如Ordinal_Number

|  ID | Name | Ordinal_Number |
-------------------------------
|  1  | Mark |                |
-------------------------------
|  2  | Mich |                | 
-------------------------------
|  3  | Isak |                | 
-------------------------------

现在我需要用以前的记录数填写Ordinal_Number

|  ID | Name | Ordinal_Number |
-------------------------------
|  1  | Mark |       0        |
-------------------------------
|  2  | Mich |       1        | 
-------------------------------
|  3  | Isac |       2        | 
-------------------------------

我什至不知道如何尝试解决这个问题,所以我在这里问。

【问题讨论】:

Ordinal_Number 不是简单的id - 1 有什么原因吗? (之前的评论是 = 而不是 -。) @GordonLinoff:不,没有。我认为置零会更好地解释我的问题。 【参考方案1】:
 SELECT a.*, (SELECT COUNT(*) FROM Original_table WHERE a.ID>=ID) as Ordinal_Number
 FROM Original_table as a
 ORDER BY a.ID

关于更新:

UPDATE Original_table o
set  Ordinal_Number=
(SELECT COUNT(*) FROM Original_table WHERE o.ID>=ID)

或者对于 jet4 版本

UPDATE Original_table o 
inner join
(SELECT a.*, (SELECT COUNT(*) FROM Original_table WHERE a.ID>=ID) as Ordinal_Number
 FROM Original_table as a
 ORDER BY a.ID) newt
on o.ID=newt.ID
Set o.Ordinal_Number=newt.Ordinal_Number

【讨论】:

This question 似乎解释了我的问题... 对,如果你使用get4,你不能在你的更新语句中执行联合查询 以防万一,我已经用替代连接子句编辑了查询。看看它是否有效。但最有可能的是,编译器会将子查询视为相关 你必须在语句的末尾添加 commit :) 即,在你执行完所有内容之后,单独运行 commit;以便将所有更改添加到表中 我尝试在您的查询末尾添加; commit;,但出现错误。我做错了什么???【参考方案2】:

为了开始谈论从以前的记录中获取值, 您必须在表格的上下文中定义“以前”的含义。为了 大多数情况下,Access 将表视为“一大袋记录”,没有 定义的顺序——最具体地说,记录本身并不是按顺序排列的 进入顺序。在任何你想谈论“以前”或 “下一个”记录,您必须指定记录的排序顺序 - 对于 例如,在查询的 ORDER BY 子句中。并且该排序顺序必须是 根据记录中的数据定义。

如果您需要按输入顺序处理记录,那么您需要有一个 记录中设置为 Now() 的日期/时间字段 进入。如果您的记录具有连续的自动编号主键,则 In 在仔细限制的情况下,您可以使用该关键字段作为 进入顺序的指标。但是,并非所有表都使用自动编号 键,即使在那些键中,自动编号也可以变得随机,而不是 连续的,在某些情况下。所以如果你关心进入 序列,你真的应该使用日期/时间字段来存储 信息。

一旦你建立了一个可以用来确定序列的字段 的记录,您实际上并不需要将当前库存总量存储在 任何记录。它总是可以通过将 通过当前记录输入的所有记录的交易数量。 在某些情况下,为了提高效率而存储它可能很有用,但是 例如,如果有人修改了数据,则存在数据不一致的风险 较早的记录之一,无需重新计算所有后续记录的总数 记录。所以我不建议存储这个计算出来的数据,除非你发现 你真的需要。

【讨论】:

我将自动编号作为从 1 开始的主键。问题是删除记录。如果我从上面删除第二条记录,我将有 13 作为 ID。因为我需要显示记录的序号,所以我决定添加一个新字段,然后用以前的记录数 + 1 填写它。【参考方案3】:

序数以0开头,所以我会这样做:

update Original
    set Ordinal_Number = (select count(*)
                          from Original as o2 
                          where o2.ID <= original.ID
                         ) - 1;

【讨论】:

它没有用。让我首先澄清一下:我正在 MS Access 中的查询的 SQL 视图 中复制此查询。运行后,会弹出一个对话框提示我输入o2.ID 的值。在我这样做之后,只会弹出相同的对话框,要求输入o.ID。输入数字后,我收到错误操作必须使用可更新查询,这让我认为我遇到的问题在this question 中描述。关于如何解决它的任何想法?感谢您的回复。

以上是关于获取先前记录的总数的主要内容,如果未能解决你的问题,请参考以下文章

按日期获取表的所有先前记录 MySQL

MSSQLSERVER中如何快速获取表的记录总数

Oracle :基于期间的先前记录获取价值

MySQL高效获取记录总数

分页总数计算,根据总记录数获取分页总数_目标科技

获取活动记录中的变量总数