我们假设我有一个包含以下两个记录的数据库表:
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。
有人可以帮忙吗?
答案 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