分组声明不起作用

时间:2014-04-16 19:46:35

标签: sql oracle group-by

目前,我有下表:

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。

3 个答案:

答案 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兼容,但你可以找到相同的,我确定。