我有一个SQL查询,它基于以下表格:
Metric
----------
ID
Description
Desired_Future_State_Metric
----------
ID
Metric_ID
Desired_Future_State_ID
Target_Value
Target_Date
Metric_Value_Measurement
----------
ID
Metric_ID
Measurement_Date
Measurement_Value
目标是从Measurement_Value
找到每个Metric_ID
的最新Metric_Value_Measurement
,以便在Desired_Future_State_Metric
的表格中显示。 (对于每个Value_Measurement
,最近的测量应定义为最新日期的Metric_ID
。
以下SQL(从另一个问题的答案生成)是起点,因为它允许我获取所有必需的数据,包括最近的日期;我唯一能做的就是加入实际的Measurement_Value
。
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
,S.MaxDate
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.MetricID)
INNER JOIN (SELECT Metric_ID, Max(Measurement_Date) As MaxDate FROM
Metric_Value_Measurement GROUP BY Metric_ID) As S
ON Metric.ID = S.Metric_ID
ORDER 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
,S.MaxDate;
为了尝试将最新测量的ID
放入表中,我尝试将子查询更改为:
(SELECT Metric_ID, Max(Measurement_Date) As MaxDate, MAX(ID) FROM
Metric_Value_Measurement GROUP BY Metric_ID)
我的想法是,这会给我MaxDate
的最高ID(我可以用它来获取Measurement_Value
)但不幸的是,这两列是独立获得最大值的;因此,ID只是Metric_ID
的ID列的MAX,而不是Metric_ID
和日期的最大值。
所以,我似乎需要在该表上进行自联接以获得测量值,但每次我尝试这样做时,我都会得到错误(即使我在我的加入中使用了括号):
JOIN expression not supported
自我加入正确的方式来解决这个问题吗?有没有其他方法可以获得Measurement_Value
?
答案 0 :(得分:1)
这为您提供了最新的测量日期。
select metric_id, max(measurement_date) max_measurement_date
from metric_value_measurement
group by metric_id;
将其加入metric_value_measurement以获取最近测量日期的整行。
select t1.metric_id, t1.measurement_date, t1.measurement_value
from metric_value_measurement t1
inner join (select metric_id, max(measurement_date) maxdate
from metric_value_measurement
group by metric_id
) t2
on t1.metric_id = t2.metric_id
and t1.measurement_date = t2.maxdate;
这本身就是一个有用的查询。如果我是你,我将从这个SELECT语句创建一个视图,并在查询中使用该视图。 Microsoft Access的优化程序在优化连接中使用的视图方面做得很好。我们假设您将该视图命名为Most_Recent_Metric_Value_Measurement。
然后我想你可以改变这个内连接。 。
INNER JOIN (SELECT Metric_ID, Max(Measurement_Date) As MaxDate FROM
Metric_Value_Measurement GROUP BY Metric_ID) As S
ON Metric.ID = S.Metric_ID
。 。 。对此。 。
INNER JOIN Most_Recent_Metric_Value_Measurement S
ON Metric.ID = S.Metric_ID
剩下的一点是你正在使用列别名" maxdate"在外部查询中。在我写这篇文章时,上面的查询使用了原始列名," measurement_date",而不是" maxdate"。 (我认为" measurement_date"当你观察视图时更有意义。)所以你需要改变" maxdate"到外部查询中的measurement_date,或更改视图以使用列别名" maxdate"。