0

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

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

4 回答 4

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()函数中。

于 2013-09-25T22:00:05.590 回答
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)
于 2013-09-25T22:29:52.217 回答
0

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

于 2013-09-25T22:03:58.787 回答
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
于 2013-09-25T22:08:42.487 回答