SQL连接表和查找最大值

时间:2017-03-14 14:51:31

标签: sql ms-access join max threshold

我有两张桌子XY和上衣。我正在尝试使用MS ACCESS和SQL来连接这些表(在wid上),但只保留每个XY.wid的最大Tops.Depth_Top小于XY.TVD。 我对SQL很新,但做了以下两个查询。第一个标识所有高于阈值的数据(Depth_Tops< = TVD)。

    SELECT DISTINCT XY.wid, Tops.Name, Tops.Depth_Top, XY.TVD 
    INTO Result_SQ
    FROM Tops 
    INNER JOIN XY 
    ON Tops.wid = XY.wid
    WHERE (((Tops.Depth_Top)<=[XY].[TVD]))
    ORDER BY XY.wid, Tops.Depth_Top

第二个查询从第一个查询中获取结果,并且仅保留最大值Depth_Top。

    SELECT * INTO Unique_Result_SQ
    FROM Result_SQ AS t1
    WHERE (((t1.Depth_Top)=(Select MAX(Depth_Top)
    From Result_SQ t2
    Where t2.XY_wid = t1.XY_wid
    Group BY t2.XY_wid)));

如果这两个查询都是独立执行的,那么这些查询会获得理想的结果,但是,我很难将这两个查询合并为一个。

1 个答案:

答案 0 :(得分:0)

我不确定为什么你需要所有那些SELECT INTO(如果你真的需要它可以添加它们)但我只是将Max添加到选择列表而不是WHERE:

SELECT 
    XY.wid, Tops.Name, XY.TVD , 
    Max(Tops.Depth_Top)
FROM Tops JOIN XY 
    ON Tops.wid = XY.wid
WHERE Tops.Depth_Top =< XY.TVD
Group BY XY.wid, Tops.Name, XY.TVD 

根据您的评论,我了解您希望结果集中每个组的最大值。为了做到这一点,你必须首先为每个组中的每一行分配一个ROW_NUMBER,然后在最后的SELECT中,只选择RN = 1(最高结果),所以你的代码看起来像这样:

WITH CTE_RN AS
(
SELECT 
    XY.wid, Tops.Name, XY.TVD , 
    Max(Tops.Depth_Top),
    ROW_NUMBER ( )   
      OVER (PARTITION BY XY.wid 
        ORDER BY Tops.Depth_Top DESC ) AS RN  
FROM Tops JOIN XY 
    ON Tops.wid = XY.wid
WHERE Tops.Depth_Top =< XY.TVD
Group BY XY.wid, Tops.Name, XY.TVD 
)
SELECT * FROM CTE_RN WHERE RN=1

我没有测试过,但它应该给你一个想法