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

时间:2014-05-25 21:14:36

标签: sql ms-access ms-access-2007

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

用例很简单:主报告列出了指标;每个指标都可以有很多测量值。我想根据测量日期仅列出表中最新的测量值。

在访问查询构建器中,我可以愉快地将测量结果添加到查询中;我目前只用两个单独的列(一个用于测量值,另一个用于测量日期)来确定如何执行此操作。我想要做的是获取测量值列表,按日期排序,以便我可以获得每个指标的最新测量值;遗憾的是,查询构建器不允许我这样做,因为它只提供了按列本身排序的选项,而不是另一列。

如何在查询构建器中根据日期列获取最新的度量值(接受重复日期会有一些奇怪的行为,我将根据其他地方的规则处理)?

我的表结构是:

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

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

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

编辑:基于下面的评论,我写了以下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;

1 个答案:

答案 0 :(得分: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)