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 连接表和查找最大值的主要内容,如果未能解决你的问题,请参考以下文章