查找一对多关系中的最新测量?

Posted

技术标签:

【中文标题】查找一对多关系中的最新测量?【英文标题】:Find most recent measurement in one-to-many relationship? 【发布时间】:2014-05-25 21:14:35 【问题描述】:

我目前正在尝试从 Access 2007 查询中的相关表返回单个值,该查询以一对多关系连接到主表。出于格式原因,我想避免使用子报表。

用例很简单:主报告列出指标;每个指标可以有许多测量值。我想根据测量日期仅在表格中列出最近的测量结果。

在访问查询构建器中,我可以愉快地将测量结果添加到查询中;我目前只研究了如何使用两个单独的列(一个用于测量值,另一个用于测量日期)。我想做的是获取按日期排序的测量值列表,以便我可以获得每个指标的最新测量值;不幸的是,查询生成器不允许我这样做,因为它只给了我按列本身排序的选项,而不是另一列。

如何才能在查询生成器中根据日期列仅获取最近的测量值(接受重复日期会出现一些奇怪的行为,我将在其他地方使用规则处理)?

我的表结构是:

DFS_Metric
-------------
ID
DFS_ID
Metric_ID

Metric
-------------
ID
Description
Unit

Metric_Value_Measurement
-------------
ID
Metric_ID
Measurement_Date
Measurement_Value

编辑:根据下面的 cmets,我编写了以下 SQL,这似乎给了我一个语法错误 - 如果我能在哪里出错,我将不胜感激:

SELECT Desired_Future_State_Metric.Desired_Future_State_ID
    ,Desired_Future_State_Metric.Metric_ID
    ,Desired_Future_State_Metric.Target_Value
    ,Desired_Future_State_Metric.Target_Date
    ,Metric.Description
    ,Metric.Unit
    ,Metric_Value_Measurement.Measurement_Date
FROM (
    (
        Metric INNER JOIN Desired_Future_State_Metric 
                ON Metric.ID = Desired_Future_State_Metric.Metric_ID
        ) INNER JOIN Metric_Unitvalue ON Metric.ID = Metric_Unitvalue.Metric_ID
    )
INNER JOIN Metric_Value_Measurement ON (
        Metric.ID = Metric_Value_Measurement.Metric_ID
        AND (
            SELECT Measurement_Date
            FROM Metric_Value_Measurement
            WHERE Metric_ID = Metric.ID
            ) = Metric_Value_Measurement.Measurement_Date
        )
GROUP BY Desired_Future_State_Metric.Desired_Future_State_ID
    ,Desired_Future_State_Metric.Metric_ID
    ,Desired_Future_State_Metric.Target_Value
    ,Desired_Future_State_Metric.Target_Date
    ,Metric.Description
    ,Metric.Unit
    ,Metric_Value_Measurement.Measurement_Date;

【问题讨论】:

我从不使用查询生成器。在 SQL 中,您将使用 SELECT m.*, mvm.* FROM metric m JOIN Metric_Value_Measurement mvm ON mvm.Metric_ID=m.ID AND mvm.Measurement_Date=(SELECT MAX(Measurement_Date) FROM Metric_Value_Measurement WHERE Metric_ID=m.ID) 之类的语句.正如您所说,如果有多个具有相同 Metric_ID 和 Measurement_Value 的测量值,这可能会生成重复的行。您可以尝试编写此 SQL 语句,然后查看查询生成器如何向您显示它。 感谢您的评论 - 我在上面添加了一些代码,我觉得很接近,但我还没有完成。 什么是完整的语法错误信息? 完整的错误消息只是“查询表达式中的语法错误 'Metric.ID = Metric_Value_Measurement.Metric_ID AND (SELECT Measurement_Date FROM Metric_Value_Measurement WHERE Metric_ID = '1') = Metric_Value_Measurement.Measurement_Dat'。(不是错字 - 它错过了最后的“e”,但它在代码中)。 我已经进行了检查,以确保表达式 'SELECT Measurement_Date FROM Metric_Value_Measurement WHERE Metric_ID = 1' 在单独的查询中独立工作,它确实如此。我还确认从内部连接中删除“AND”部分不会导致错误消息,所以问题出在该部分。 【参考方案1】:

长嵌套的 SQL 语句在访问时可能会很痛苦。我会进行一个按measurement_ID分组的查询,并获取最近的日期,然后再次将该查询链接到测量表:

QUERY 'MostRecentMeasurements':
SELECT Metric_ID, MAX(Measurement_date) as MostRecentMeasurementDate FROM Measurement
GROUP BY Metric_ID

QUERY2:
SELECT Metric_ID, Measurement_value FROM Measurement INNER JOIN MostRecentMeasurements ON
(Measurement.Metric_ID=MostRecentMeasurements.Metric_ID) AND (Measurement.Measurement_date = 
MostRecentMeasurements.MostRecentMeasurementDate)

【讨论】:

以上是关于查找一对多关系中的最新测量?的主要内容,如果未能解决你的问题,请参考以下文章

在一对多关系查询中查找缺失的记录

查找2列之间的一对一/一对多关系

在模型值及其关系中查找字符串的一部分的自定义搜索(一对多)

一对多查找,转换为一对一维度

如何描述 Coq 中的一对多关系?

一对多关系中的 CascadeType 问题