目前,我有下表:
ID, Name, Code, Date
1 AB x1 01/03/2014
1 AB x2 01/04/2014
1 AB x3 01/05/2014
2 BC x3 01/05/2014
2 BC x5 01/06/2014
3 CD x1 01/06/2014
我想要以下输出:
ID, Name, Code, Date
1 AB x3 01/05/2014
2 BC x5 01/06/2014
3 CD x1 01/06/2014
所以基本上,我只想要最新的日期,而不需要关心代码。
在我的代码中,我有
select id, name, code, max(date)
group by id, name, code
但是群组不起作用,因为它也会考虑代码,因此我不会得到最新的约会。此外,我不能在代码中留下代码,因为它会给我一个错误。
如何在不包含代码的情况下使用组? 我使用PL / SQL开发人员作为IDE。
答案 0 :(得分:3)
select id, name, code, date
from (
select id, name, code,
date,
max(date) over (partition by id) as max_date
from the_table
)
where date = max_date;
如果您想要选择其中一个日期,如果有多个"最大日期"您可以改为使用row_number()
:
select id, name, code, date
from (
select id, name, code,
date,
row_number() over (partition by id order by date desc) as rn
from the_table
)
where rn = 1;
顺便说一下:date
是一个可怕的名字。一个是因为它也是数据类型的名称,但更重要的是因为它根本不记录列包含的内容。一个"结束日期"? A"开始日期"? A"截止日期"? ...
答案 1 :(得分:1)
你想要的是最新更新的记录吗?
select t1.*
from table t1
inner join (select id, name, max(date) as latest_date
from table
group by id, name) t2 on t1.date = t2.latest_date
and t1.id = t2.id and t1.name = t2.name
最好在日期栏上加上索引
答案 2 :(得分:-1)
我假设您希望获得具有最大日期的行上的代码。如果你真的不关心返回什么代码,只需使用像max(code)这样的聚合函数。
否则,你可以这样做:
SELECT t1.id, t1.name, t2.code, t2.date
FROM MyTable t1
CROSS JOIN (
SELECT TOP 1 code, date
FROM MyTable t3
WHERE t3.id=t1.id
AND t3.name=t1.name
ORDER BY t3.date DESC
) t2
我不确定CROSS JOIN是否与PL / SQL兼容,但你可以找到相同的,我确定。