2013-05-14 80 views
1

我需要一些幫助與此查詢,我需要每一個碼的最近日期來獲取代碼名稱地址(DATE1在這個例子中< date6)SQL甲骨文 - max函數

TAB1

code address 
==================== 
    cod1 addr1 
    cod2 addr2 
    cod3 addr3 
    cod4 addr4 

TAB2

code date  name 
=========================== 
    cod1 date1 name1 
    cod1 date2 name1 
    cod1 date3 name2 
    cod2 date3 name3 
    cod3 date5 name4 
    cod3 date6 name5 
    cod4 date3 name6 

所以我寫

SELECT Tab1.code, Tab1.address, Tab2.name, max(Tab2.date) 
FROM Tab1, Tab2 
WHERE Tab1.code=Tab2.code 
GROUP BY 
Tab1.code, Tab1.address, Tab2.name 
ORDER BY 
Tab2.name 

,但我沒有得到我想要的,同樣的代碼與不同的日期多次,所以我想一個連接或嵌套的選擇是必要的,但正在一點點無知的我問這裏尋求幫助

+0

請添加預期的輸出。 – TechDo 2013-05-14 10:14:20

+0

預期輸出: COD1 ADDR1名2 DATE3 COD2 ADDR2 NAME3 DATE3 COD3 ADDR3 NAME5 date6 COD4 ADDR4 name6 DATE3 – 2013-05-21 12:50:30

回答

1

您可以使用分析功能或聚合功能。

Analytics

SELECT code, address, name, date 
    FROM (SELECT Tab1.code, Tab1.address, Tab2.name, Tab2.date, 
       row_number() OVER (PARTITION by tab1.code 
            ORDER BY tab2.date DESC) rn 
      FROM Tab1 
      JOIN Tab2 ON tab1.code = tab2.code) 
WHERE rn = 1 

Aggregates

SELECT Tab1.code, Tab1.address, 
     MAX(Tab2.name) KEEP (DENSE_RANK FIRST ORDER BY tab2.date DESC) name, 
     MAX(tab2.date) KEEP (DENSE_RANK FIRST ORDER BY tab2.date DESC) date 
    FROM Tab1 
    JOIN Tab2 ON tab1.code = tab2.code 
GROUP BY Tab1.code, Tab1.address 

這將在表1中選擇的每一行的一行如果有在表2中的兩行具有相同的日期爲相同的代碼,只有一行將被任意選擇。

+0

其實你提出的分析拋出一個缺少表達錯誤 的聚集[ERR] ORA-00923:FROM關鍵字未找到其中預計 – 2013-05-21 13:17:38

+0

Oracle版本是11.1.0.6.0 – 2013-05-21 13:19:45

+0

@ Jarod81下一次不要使用保留字'DATE'作爲您的列名之一。另外如果你想讓人們測試提供CREATE和INSERT語句。您可以使用[SQLFiddle](http://sqlfiddle.com/#!4/d41d8/11184)來構建更好的完整示例。最後,你必須期望做出一些調整,我*假設你會用例子=中的實際列名替換虛構的名字。 – 2013-05-21 16:22:34