选择具有最大创建日期的记录

时间:2013-09-25 21:56:37

标签: sql oracle oracle11g

我们假设我有一个包含以下两个记录的数据库表:

CACHE_ID  BUSINESS_DATE  CREATED_DATE
1183      13-09-06       13-09-19 16:38:59.336000000
1169      13-09-06       13-09-24 17:19:05.762000000
1152      13-09-06       13-09-17 14:18:59.336000000
1173      13-09-05       13-09-19 15:48:59.136000000
1139      13-09-05       13-09-24 12:59:05.263000000
1152      13-09-05       13-09-27 13:28:59.332000000

我需要编写一个查询,该查询将返回最近CREATED_DATE的记录的CACHE_ID。

我在制作这样的查询时遇到了麻烦。我可以根据BUSINESS_DATE进行GROUP BY并获得MAX(CREATED_DATE)...当然,我不会有记录的CACHE_ID。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

对oracle语法不肯定,但使用ROW_NUMBER()函数:

SELECT BUSINESS_DATE, CACHE_ID
FROM (SELECT t.*,
             ROW_NUMBER() OVER(PARTITION BY BUSINESS_DATE ORDER BY CREATED_DATE DESC) RN
      FROM YourTable t
     )sub
WHERE RN = 1

ROW_NUMBER()函数为每一行分配一个数字。 PARTITION BY是可选的,但用于为该组中的每个值开始编号,即:如果您PARTITION BY BUSINESS_DATE,那么对于每个唯一的BUSINESS_DATE值,编号将从1开始。ORDER BY当然用于定义计数应该如何进行,并且在ROW_NUMBER()函数中是必需的。

答案 1 :(得分:1)

您想要在营业日期进行分组,并获得具有最新创建日期的CACHE_ID吗?使用这样的东西:

select yt.CACHE_ID, yt.BUSINESS_DATE, yt.CREATED_DATE
from YourTable yt
where yt.CREATED_DATE = (select max(yt1.CREATED_DATE)
                           from YourTable yt1
                          where yt1.BUSINESS_DATE = yt.BUSINESS_DATE)

答案 2 :(得分:0)

不确定确切的语法,但从概念上讲,您只能按CREATED_DATE降序排序并选择第一个?

答案 3 :(得分:0)

所有记录 -

select top 1 CACHE_ID from YourTable order by CREATED_DATE desc

每个BUSINESS_DATE -

select distinct 
a.BUSINESS_DATE,
(
    select top 1 b.CACHE_ID 
    from YourTable b where a.BUSINESS_DATE = b.BUSINESS_DATE
    order by b.CREATED_DATE desc
) as Last_CREATED_DATE
from YourTable a