2013-05-14 71 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