【问题标题】:MS Acess: max(Date/Time field) on query when field may contain 00:00:00MS Access:查询时的最大(日期/时间字段)字段可能包含 00:00:00
【发布时间】:2015-12-28 02:45:06
【问题描述】:

我正在尝试在 MS Access 中构建一个查询,该查询返回给定实体 ID 的最后日期/时间。研究表明,在相应字段上使用 MAX() 函数并在其余字段上使用 GROUP BY 似乎是可行的方法。

但是,在存在 0 小时、0 分钟和 0 秒的值的情况下,这似乎不起作用,因为它也显示了这些值。查询的SQL如下:

SELECT Int(Historico_Classificacoes.ID_Entidade) AS ID_Entidade, Max(Historico_Classificacoes.Timestamp_Classificacao) AS [Data da última classificação], Historico_Classificacoes.US_Indicia_Pais_Constituicao, Historico_Classificacoes.US_Indicia_Responsabilidades_Fiscais, Historico_Classificacoes.US_Indicia_Morada_Coletiva, Historico_Classificacoes.US_Indicia_Telefone, Historico_Classificacoes.US_Indicia_Proveniencia_Capital, Historico_Classificacoes.US_Indicia_Beneficiários, Historico_Classificacoes.US_Indicia_Naturalidade, Historico_Classificacoes.US_Indicia_Nacionalidade, Historico_Classificacoes.US_Indicia_Morada_Singular, Historico_Classificacoes.US_Indicia_Laboral
FROM Historico_Classificacoes
GROUP BY Int(Historico_Classificacoes.ID_Entidade), Historico_Classificacoes.US_Indicia_Pais_Constituicao, Historico_Classificacoes.US_Indicia_Responsabilidades_Fiscais, Historico_Classificacoes.US_Indicia_Morada_Coletiva, Historico_Classificacoes.US_Indicia_Telefone, Historico_Classificacoes.US_Indicia_Proveniencia_Capital, Historico_Classificacoes.US_Indicia_Beneficiários, Historico_Classificacoes.US_Indicia_Naturalidade, Historico_Classificacoes.US_Indicia_Nacionalidade, Historico_Classificacoes.US_Indicia_Morada_Singular, Historico_Classificacoes.US_Indicia_Laboral
ORDER BY Int(Historico_Classificacoes.ID_Entidade);

Historico_Classificacoes 表当前包含以下数据:

"ID_Entidade";"Timestamp_Classificacao";"Classificacao_DMIF";"Notacao_Risco_BCFT";"US_Indicia_Pais_Constituicao";"US_Indicia_Responsabilidades_Fiscais";"US_Indicia_Morada_Coletiva";"US_Indicia_Telefone";"US_Indicia_Proveniencia_Capital";"US_Indicia_Beneficiários";"US_Indicia_Naturalidade";"US_Indicia_Nacionalidade";"US_Indicia_Morada_Singular";"US_Indicia_Laboral"
"62";20/9/2015 00:00:00;1;30;1;1;1;1;1;1;1;1;1;0
"62";28/9/2015 10:43:38;1;30;1;1;1;1;1;1;1;1;1;1
"62";29/9/2015 17:52:24;1;30;1;1;1;1;1;1;1;1;1;1
"62";29/9/2015 17:52:40;1;30;1;1;1;1;1;1;1;1;1;1
"98";20/9/2015 00:00:00;2;15;1;1;1;1;1;1;0;0;0;0
"98";20/9/2015 00:00:01;0;0;0;0;0;0;0;0;0;0;0;0

查询在数据表视图中执行时会输出以下内容:

"ID_Entidade";"Data da última classificação";"US_Indicia_Pais_Constituicao";"US_Indicia_Responsabilidades_Fiscais";"US_Indicia_Morada_Coletiva";"US_Indicia_Telefone";"US_Indicia_Proveniencia_Capital";"US_Indicia_Beneficiários";"US_Indicia_Naturalidade";"US_Indicia_Nacionalidade";"US_Indicia_Morada_Singular";"US_Indicia_Laboral"
62;29/9/2015 17:52:40;1;1;1;1;1;1;1;1;1;1
62;20/9/2015 00:00:00;1;1;1;1;1;1;1;1;1;0
98;20/9/2015 00:00:00;1;1;1;1;1;1;0;0;0;0
98;20/9/2015 00:00:01;0;0;0;0;0;0;0;0;0;0

实体 62 和 98 存在重复记录,而每个实体只需要一条记录。我在这里错过了什么吗?为什么存在值为 00:00:00 的条目?

【问题讨论】:

    标签: datetime ms-access max


    【解决方案1】:

    您可能需要考虑使用附加查询作为中间步骤,首先确定每个组 ID 的 MAX 日期/时间组合,然后使用后续查询提取该组 ID、日期和时间匹配的整个记录​​,这将确保您不必在其余字段上使用 FirstMin,并且您将始终获得正确的数据

    【讨论】:

      【解决方案2】:

      您将Group By 用于最后一个字段,例如US_Indicia_Morada_SingularUS_Indicia_Laboral。您还必须在这些上使用 First, Last, Min,Max

      【讨论】:

      • 如果我在其他所有字段中都使用 Min 而不是 Max,会有多大的不同?在 ID_Entidade 上使用 GROUP BY,在 Timestamp_Classificacao 上使用 Max,在所有其他字段上使用 Max 似乎会产生我想要的结果......但这真的是要走的路,考虑到我正在尝试选择最近日期的记录吗?
      • 否,那么您将需要一个子查询来从当前查询中检索最新日期的 ID 的详细信息。
      【解决方案3】:

      这是你的尝试(没有重复的别名)

        SELECT INT(ID_Entidade)             AS ID_Entidade
             , MAX(Timestamp_Classificacao) AS [Data da última classificação]
             , US_Indicia_Pais_Constituicao
             , US_Indicia_Responsabilidades_Fiscais
             , US_Indicia_Morada_Coletiva
             , US_Indicia_Telefone
             , US_Indicia_Proveniencia_Capital
             , US_Indicia_Beneficiários
             , US_Indicia_Naturalidade
             , US_Indicia_Nacionalidade
             , US_Indicia_Morada_Singular
             , US_Indicia_Laboral
          FROM Historico_Classificacoes
      GROUP BY INT(ID_Entidade)
             , US_Indicia_Pais_Constituicao
             , US_Indicia_Responsabilidades_Fiscais
             , US_Indicia_Morada_Coletiva
             , US_Indicia_Telefone
             , US_Indicia_Proveniencia_Capital
             , US_Indicia_Beneficiários
             , US_Indicia_Naturalidade
             , US_Indicia_Nacionalidade
             , US_Indicia_Morada_Singular
             , US_Indicia_Laboral
      ORDER BY INT(ID_Entidade);
      

      来自您的 cmets,这里是接近您需要的 SQL。我已经为您添加了“AnotherField”字段,您可能需要也可能不需要在此处添加字段。

      这当前会从表中选择整条记录,但只列出在另一个字段中找到的每个值的单个“最新”记录。

      您可能需要更多的字段,而另一个字段出现在 SQL 中。将您使用的字段而不是 AnotherField 视为需要用于查找最大日期记录的字段。

      SELECT Main.*
        FROM Historico_Classificacoes AS Main
             INNER JOIN (  SELECT AnotherField
                               , MAX(Timestamp_Classificacao) AS [MaxDate]
                            FROM Historico_Classificacoes
                        GROUP BY AnotherField
                        )
                        AS MostRecent
                     ON ( Main.AnotherField            = MostRecent.AnotherField
                          AND 
                          Main.Timestamp_Classificacao = MostRecent.MaxDate 
                        )     
      

      【讨论】:

      • 您觉得以上内容有用吗?如果是,请标记为答案。
      猜你喜欢
      • 2017-08-11
      • 2013-07-12
      • 1970-01-01
      • 2012-04-27
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      相关资源
      最近更新 更多