2017-03-14 65 views
1

我有兩個表XY和上面。我試圖使用MS ACCESS和SQL來連接這些表格(在wid上),但只保留每個XY.wid的最大Tops.Depth_Top小於XY.TVD。 我對SQL相當陌生,但做了以下兩個查詢。第一個標識高於閾值的所有數據(Depth_Tops < = TVD)。SQL加入表和查找最大值

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

我不知道爲什麼你需要所有這些SELECT INTO S(你可以添加他們,如果你真的需要它),但我想補充的最大的選擇列表,而不是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 

我還沒有測試過它,但它應該給你的想法

+0

感謝您的答案。該代碼返回與我的第一個查詢相同的結果。 不確定是否這是原因,但wid和Name是相互獨立的。 http://imgur.com/a/EFlvN 我想刪除突出顯示的行以及底部兩行。 –

+0

所以你只想要返回一行? – morinx

+0

在這個例子中它將是兩行(wid 0和1)。原始表格的深度均小於或大於TVD。我只想保留每個wid的最大深度小於TVD的信息。 –