我的一位同事制定了必要的 SQL。这是通用解决方案(请注意,我确实需要根据两个字段的组合对数据集中的多个系列进行编号。在原始帖子中的简化示例中,我只使用了一个字段 - 颜色 - 但因为我确实需要两个字段,这就是我在这个解决方案中展示的内容。
SELECT *,
(SELECT COUNT(T1.ID)
FROM
[TableName] AS T1
WHERE T1.ID >= T2.ID and t1.[NameCriteriaField1] = t2.[NameCriteriaField1]
and t1.[NameCriteriaField2]= t2.[NameCriteriaField2])
AS Sequence into OutputResultsTableName
FROM
[TableName] AS T2
ORDER BY [NameCriteriaField2] , [NameCriteriaField1]
源表设置为“ID”作为具有整数值的字段。每条记录都有一个唯一的 ID 值,但 ID 中是否存在间隙或记录如何根据 ID 排序都无关紧要。 (例如,典型的 MS 访问自动编号的主键字段用于此目的)
此查询设置为假设您的数据集中有两个字段要用于对记录进行分组,并为每个组中的每个记录分配一个数字系列计数。 (因此您的表可能包含多个组,并且每个组都有自己的编号序列,从 1 开始。但查询的制定方式,正好有 2 个标准来定义组。)您不能使用任何 where 子句来进一步过滤被计数的记录。通过实验,我发现添加 where 子句会产生不可靠的结果,其中记录可能会被省略。因此,如果您需要过滤结果以使某些记录不包含在特定组的数字系列中,请在运行我的查询之前执行以下操作之一:
每个组的编号从 1 开始,查询根据条件 1 和条件 2 的不同组合动态定义组。但是,如果您有不属于任何组的记录,则这些记录将全部编号为 0。(Criteria1 和 criteria2——至少在我的测试范围内——是非空值。(理论上——至少在 Microsoft Access 上,空字符串与 Null 不同,但我也没有使用空字符串对此进行测试。)如果您的记录在条件 1 或条件 2 字段中为空,MS Access 会将这些记录视为不属于任何组,因此将它们编号为 0。也就是说,这些不同的组需要为条件 1 和条件 2 定义非空值,因此这与 SQL DISTINCT 语句的工作方式不同。
如果您需要将 NULL 作为定义组的有效标准(从而使组由 NULL 编号),这非常简单。在运行我的查询之前,首先运行一条更新语句,将条件 1 或条件 2 中的所有空值实例更改为短语“空字段的占位符”。然后运行我的查询。在结果集上(在为组分配编号之后),运行另一个更新以将所有出现的占位符短语改回 null。
如果您的组仅由一个字段标准定义,则调整语法
SELECT *,
(SELECT COUNT(T1.ID)
FROM
[TableName] AS T1
WHERE T1.ID >= T2.ID and t1.[NameCriteriaField1] = t2.[NameCriteriaField1] )
AS Sequence into OutputResultsTableName
FROM
[TableName] AS T2
ORDER BY [NameCriteriaField2] , [NameCriteriaField1]
如果您的组由 3 个字段条件的组合定义,则调整语法
SELECT *,
(SELECT COUNT(T1.ID)
FROM
[TableName] AS T1
WHERE T1.ID >= T2.ID and t1.[NameCriteriaField1] = t2.[NameCriteriaField1]
and t1.[NameCriteriaField2]= t2.[NameCriteriaField2]
and t1.[NameCriteriaField3]= t2.[NameCriteriaField3])
AS Sequence into OutputResultsTableName
FROM
[TableName] AS T2
ORDER BY [NameCriteriaField2] , [NameCriteriaField1]