1

我需要有关此查询的帮助,我需要获取每个代码的最新日期的代码名称地址(在此示例中,date1 < date6)

选项卡1

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

选项卡2

    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

但我没有得到我想要的,相同的代码多次使用不同的日期,所以我想加入或嵌套选择是必要的,但有点无知我在这里寻求帮助

4

1 回答 1

1

您可以使用分析或聚合函数。

分析

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

聚合

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 中有两行具有相同日期的相同代码,则将仅任意选择一行。

于 2013-05-14T14:07:18.620 回答