因此,目前我有以下表格:
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但是group by不起作用,因为它还会考虑代码,因此我不能只得到最新的日期。此外,我不能将代码留在group by语句中,因为它会给我一个错误。
如何在不包含代码的情况下使用group by?我使用PL/SQL developer作为IDE。
发布于 2014-04-17 04:21:21
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是一个可怕的名字。一方面是因为它也是一种数据类型的名称,但更重要的是因为它根本没有记录列包含的内容。“结束日期”?“开始日期”?“预产期”?...
发布于 2014-04-17 04:27:30
你想要的是最新的更新记录,对吗?
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在日期列上建立索引是很好的
发布于 2014-04-17 04:07:17
我假设您想要获取具有最大日期的行上的任何代码。如果你真的不关心返回什么代码,只需要在它上面使用一个聚合函数,比如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兼容,但我相信您可以找到相同的东西。
https://stackoverflow.com/questions/23118795
复制相似问题