我有两张桌子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)));
如果这两个查询都是独立执行的,那么这些查询会获得理想的结果,但是,我很难将这两个查询合并为一个。
答案 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
我没有测试过,但它应该给你一个想法