【问题标题】:SQL Join Table and Find MaxSQL 连接表和查找最大值
【发布时间】:2017-03-14 14:51:30
【问题描述】:

我有两张桌子 XY 和 Tops。我正在尝试使用 MS ACCESS 和 SQL 来加入这些表(在 wid 上),但只保持每个 XY.wid 的最大 Tops.Depth_Top 小于 XY.TVD。 我对 SQL 相当陌生,但做了以下两个查询。第一个识别所有高于阈值 (Depth_Tops

    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)));

如果这两个查询都是独立执行的,那么这些查询可以达到预期的结果,但是,我无法将两者合二为一。

【问题讨论】:

    标签: sql ms-access join max threshold


    【解决方案1】:

    我不确定你为什么需要所有这些 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 
    

    根据您的 cmets,我了解您希望结果集中每个组的最大值。为此,您必须首先为每个组中的每一行分配一个 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
    

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

    【讨论】:

    • 感谢您的回答。该代码返回与我的第一个查询相同的结果。不确定这是否是原因,但 wid 和 Name 是相互独立的。 imgur.com/a/EFlvN我想删除突出显示的行以及底部的两行。
    • 所以你只想返回一行?
    • 在本例中它将是两行(wid 0 和 1)。原始表格的深度既小于又大于 TVD。我只想保留与每个宽度小于 TVD 的最大深度相关的信息。
    猜你喜欢
    • 2019-12-17
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多