SQL 连接表和查找最大值

Posted

技术标签:

【中文标题】SQL 连接表和查找最大值【英文标题】:SQL Join Table and Find Max 【发布时间】: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)));

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

【问题讨论】:

【参考方案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 的最大深度相关的信息。

以上是关于SQL 连接表和查找最大值的主要内容,如果未能解决你的问题,请参考以下文章

查找内部联接的最大值 - SQL

SQL:从 SQL Server 中的嵌套 JSON 中查找最大值

sql查找指定字段最大值(或最小值)的某一行数据

MySQL 题1

Spark SQL - 查找每年一个月的最大值

如何使用单个 SQL 查询查找每列的最大值