查找一对多关系中的最新测量?
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)
【讨论】:
以上是关于查找一对多关系中的最新测量?的主要内容,如果未能解决你的问题,请参考以下文章