【问题标题】:Access: Count the First Instance of Each Unique Value in a Column访问:计算列中每个唯一值的第一个实例
【发布时间】:2020-01-13 18:28:29
【问题描述】:

我试图为列中每个唯一值的第一个实例返回一个 1,并为第一个唯一实例之后的每个重复值返回一个 0。

在 Excel 中,我使用了以下公式,但在较大的工作表上它变得不稳定。

=IF(COUNTIF($A$2:A2,A2)=1,1,0)

ID    Unique
ABC1       1
ABC1       0
ABC1       0
ABC2       1
ABC3       1
ABC3       0
ABC4       1

【问题讨论】:

  • MS Access 使用无序数据集,因此您首先需要定义排序顺序,以便您可以明确定义构成“第一个实例”的内容。例如,您的表是否有一个递增的主键可以对其进行排序?
  • 是的,我可以按主键排序
  • 您的表是否有ID 和单独的主键列?

标签: sql ms-access


【解决方案1】:

这是一种方法:

SELECT IDPK, ID, DCount("*","TableName","ID='" & [ID] & "' AND IDPK<" & [IDPK])+1 AS U, 
       IIf([U]=1,1,0) AS [Unique]
FROM TableName
ORDER BY IDPK;

请注意,域聚合函数可能会导致大型数据集的性能下降。然而,同样可以说嵌套子查询来完成相同的结果。更多信息How to show row number in Access query like ROW_NUMBER in SQL。使用文本框 RunningSum 属性的报告选项可能是最快的。

【讨论】:

    【解决方案2】:

    假设您有一个数字主键 pk,那么以下应该会产生所需的结果:

    select t.pk, t.id, -not exists (select 1 from Table1 u where u.id=t.id and u.pk<t.pk)
    from Table1 t
    order by t.pk
    

    将两个出现的Table1 更改为您的表的名称。

    【讨论】:

      【解决方案3】:

      在分组列ID 上将表与自身进行外部联接,但仅在联接列上的主键大于主行的主键的情况下。然后使用一个事实,即不会有一个不同的ID 值的第一个(最低主键)实例的连接列来相应地生成10

      select
          a.ID,
          if(b.ID is null, 1, 0) as is_unique
      from mytable a
      left join mytable b on b.ID = a.ID
        and b.primary_key > a.primary_key
      order by a.primary_key
      

      【讨论】:

        猜你喜欢
        • 2020-10-06
        • 1970-01-01
        • 2014-04-07
        • 2023-04-06
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多