2014-07-25 56 views
0

“有序对”比方说,我有一个表格式,看起来就像这样:查找相关的SQL

Element Forces - Frames

我想编写一个定位的最大站给定帧查询和输出情况(结果按框架&输出案例分组),但也返回将与最大站关联的有序P(最终V2,V3,T,M2 & M3)。所需的查询如下所示:

Element Forces - Frames, desired query

我不能为我的生活想出解决办法。我已经张贴了访问数据库的副本,以我的谷歌驱动器:https://drive.google.com/folderview?id=0B9VpkDoFQISJOFcwS2RMSGJ5RVk&usp=sharing

+1

请显示你设法到目前为止,请。请编辑你的问题,不要把工作置于评论中。正如@ PM77-1所说 - 请显示模拟输出。 –

+0

或至少根据您的样品数据显示您所需的输出。 –

+0

请勿在评论中张贴代码。改为编辑您的帖子。 –

回答

0
select x.*, t.p 
    from (select frame, outputcase, max(station) as max_station 
      from tbl 
     group by frame, outputcase) x 
    inner join tbl t 
    on x.frame = t.frame 
    and x.outputcase = t.outputcase 
    and x.max_station = t.station 
order by x.frame, x.outputcase; 

就像一个音符,以避免混淆,W /那第二列,t是表的别名,p是列名。

我已经分配了x的别名的子查询为(帧,输出case)的每个唯一组合查找max(站)。这就是你想要的,但问题并不止于此,你也想要列p。无法在同一个查询中选择的原因是因为您必须按照它进行分组,并且您不希望每个(帧,输出,p)组合的max(站)。你需要每个组合(帧,输出)的最大值(站)。

因为我们无法在第一步中获得列p,所以我们必须使用我们获得的值(我已经分配了一个别名max_station)以及明显的帧连接条件返回到原始表和outputcase。所以我们在这3件事情上回到原始表,其中2个是实际表中的字段,其中一个是在子查询(max_station)中计算的。

因为我们已经回到原始表格,我们可以从原始表格中选择p列。

+0

无论需要做什么,你都需要在那里有一个ORDER BY。 –

+0

为什么我需要订单?我没有使用分析函数来解决问题。我正在为FRAME和OUTPUTCASE的每个组合找到最大值,然后使用该值连接回原始表。 –

+0

因为您不能保证记录将以(任何)顺序输出。看看所需的结果。当你做一个JOIN时(甚至在那之前,真的),优化器将决定混淆你想要的结果。在我之后重复:“如果我没有指定'ORDER BY',那么结果顺序是未定义的。”如果数据库遇到并发访问或正在使用并行数据访问,则尤其如此。 –

0

需要多一点的返回查询,但下面的结果提供了理想的结果:

SELECT t1.* 
FROM [Element Forces - Frames] as t1 
WHERE t1.Station In (SELECT TOP 1 t2.Station 
FROM [Element Forces - Frames] as t2 
WHERE t2.Frame = t1.Frame 
ORDER BY t2.Station DESC) 
ORDER BY t1.Frame ASC, t1.OutputCase ASC; 

我还是要感谢大家谁张贴的答案。我敢肯定,这只是我正在努力的语法错误。