【问题标题】:Inserting a rank in sequential order for grouped records in a table为表中的分组记录按顺序插入排名
【发布时间】:2014-11-17 02:01:44
【问题描述】:

我正在尝试寻找将值分配给表中的记录的最佳方法,该表从值 1 开始,然后按值 1 递增。该表包含按日期排列的记录,其中有多个记录每个日期。我需要一个解决方案(可能是一个循环),它将按日期进行,并为每个从第一个开始插入一个排名编号,并为每条记录自增一。确定新日期后,我需要再次从值开始。例如,如果我有以下 6 条记录,其中包含 4 个字段“日期”、“用户”、“用户 ID”,并且想要使用此逻辑更新字段“序列”,我的代码将 (1) 按日期对所有记录进行分组,( 2) 按用户 ID 排序并 (3) 在“序列”字段中显示以下结果:

Date         | User      | User ID | Sequence
4 September  | Mary      |    09   | 1
4 September  | Bob       |    58   | 2
4 September  | Dave      |    59   | 3
5 September  | Drew      |    32   | 1
5 September  | Steve     |    35   | 2
6 September  | Mary      |    09   | 1

我意识到我需要每天做一些循环,但需要帮助才能开始。

【问题讨论】:

  • 我猜你有一个“未提交”的过程中的变化。需要查看代码并知道您采取了哪些步骤来创建错误。
  • 我同意韦恩的观点。您需要提供比您拥有的更多的信息,以便任何人都能够提供任何帮助。
  • 对于 9 月 4 日这一天,确定 Mary(而不是 Bob 或 Dave)应该被分配序列 1 的逻辑是什么?
  • 逻辑是和用户的ID号相关联。我将编辑以上内容以更清楚。好抓汉斯
  • 将该值存储在表中通常是一个坏主意。它打破了数据库规范化的首要规则之一。你在这里的最终目标是什么?如果您让我们知道您在做什么,我们可能会提供更好的选择(@HansUp 在下面的回答中已经提出了更好的选择)。

标签: ms-access vba ms-access-2010


【解决方案1】:

如果您绝对必须存储 Sequence 值,请使用带有 DCount 表达式的 UPDATE 查询来计算 Sequence

UPDATE tblMarchese
SET [Sequence] = DCount(
    '*',
    'tblMarchese',
    '[Date]=' & Format([Date],'\#yyyy-m-d\#') &
        ' AND [User ID] <= ' & [User ID]
    );

该查询更简单,并且比打开和遍历记录集以更新您存储的 Sequence 值要快得多。

但是,请重新考虑您是否绝对必须首先存储 Sequence 值。您可以在需要查看它们的任何时候使用SELECT 查询来计算它们,这将确保您看到的 Sequence 值始终与基础数据的最新更改一致。

使用您的示例数据和下面的查询,这是我在 Access 2010 中的结果集:

Date        User   User ID Sequence
----------- ------ ------- --------
4 September Mary         9        1
4 September Bob         58        2
4 September Dave        59        3
5 September Drew        32        1
5 September Steve       35        2
6 September Mary         9        1
SELECT
    m1.Date,
    m1.User,
    m1.[User ID],
    (
        SELECT Count(*)
        FROM tblMarchese AS m2
        WHERE
                m2.Date = m1.Date
            AND m2.[User ID] <= m1.[User ID]
    ) AS [Sequence]
FROM tblMarchese AS m1
ORDER BY m1.Date, m1.[User ID];

【讨论】:

    【解决方案2】:

    我找到了!没必要继续找。以下循环例程正是我解决此问题所需要的。将此应用于我上面的“通用/理论”示例,您可以看到上面的“序列”字段如何由以下例程中的字段“ID_Event”反映。循环检查先前的记录,如果它具有相同的日期(“有效日期”),则将 1 添加到字段“ID_Event”

    Private Sub Comando197_Click()
    
    Dim sql As String
    Dim varEffective_Date As Date
    Dim NumberOfTimes
    Dim varID_Event As Integer
    
    sql = "select ID_Event,ID_ValueAddWaste,Effective_Date,ValueAddType,ValueAddType02 from tblPerformanceTrackingMaster03 where tblPerformanceTrackingMaster03.[ID_Event]=0 order by ID"
    
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    
    rs.Open sql, CurrentProject.Connection, adOpenDynamic, adLockPessimistic
    
    Dim counter As Integer
    counter = 1
    
    Do While Not rs.EOF
    
    If counter > 1 Then
    
        If varEffective_Date = rs!Effective_date Then
        rs!ID_Event = varID_Event + 1
    
        End If
    End If
    
    varEffective_Date = rs!Effective_date
    varID_Event = rs!ID_Event
    
    rs.MoveNext
    counter = counter + 1
    
    Loop
    rs.Close
    Set rs = Nothing
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2015-11-26
      相关资源
      最近更新 更多