Sql 查询中的多个最大值

Sql 查询中的多个最大值,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我知道标题听起来不太具有描述性,但这是我能想到的最好的标题: 我有这张桌子 ID BDATE VALUE 28911 14/4/2009 44820 28911 17/4/2009 32240 28911 20/4/2009 30550 28911 22/4/2009 4422587,5 28911 23/4/2009 4441659 28911 24/4/2009 7749594,67 38537 17/4/2009 58280 38537 20

我知道标题听起来不太具有描述性,但这是我能想到的最好的标题:

我有这张桌子

ID BDATE VALUE 28911 14/4/2009 44820 28911 17/4/2009 32240 28911 20/4/2009 30550 28911 22/4/2009 4422587,5 28911 23/4/2009 4441659 28911 24/4/2009 7749594,67 38537 17/4/2009 58280 38537 20/4/2009 137240 38537 22/4/2009 81098692 38605 14/4/2009 2722368 38605 20/4/2009 5600 38605 22/4/2009 1625400 38605 23/4/2009 6936575 但是它会返回所有的行,因为每个行的值collumn是不同的。此查询是在Oracle v10中设计的,我可以只使用select查询,而不创建过程

select a.* from myview a, (select id, max(bdate) from myview group by id) b
where a.id = b.id and a.bdate = b.bdate

(未经测试…我现在没有可用的Oracle…

您可以使用分析:

select 
      id, bdate, value 
    from
      (
        select
          id, bdate, value, max( bdate ) over ( partition by id ) max_bdate
        from
          myview
      )
    where
      bdate = max_bdate

我们可以在in子句中使用乘法列:

select id, bdate, value 
from myview 
where (id, bdate) in
    (select id, max(bdate)
     from myview group by id)
/

可以使用内部联接仅过滤出最大行数:

select t.*
from YourTable t
inner join (
     select id, max(bdate) as maxbdate
     from YourTable
     group by id
) filter
    on t.id = filter.id
    and t.bdate = filter.maxbdate
这张照片是:

id     bdate       value
38605  2009-04-23  6936575
38537  2009-04-22  81098692
28911  2009-04-24  7749594.67
请注意,对于具有多个值且具有相同bdate的id,这将返回多行。

您可以使用以下构造:

SQL> SELECT ID,
  2         MAX(bdate) bdate,
  3         MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY bdate DESC) VALUE 
  4   FROM DATA
  5  GROUP BY ID;

        ID BDATE            VALUE
---------- ----------- ----------
     28911 24/04/2009  7749594,67
     38537 22/04/2009    81098692
     38605 23/04/2009     6936575

这将与所建议的分析方法一样有效(无自连接,数据的单次传递)

它不会返回值collumn,我想知道您是否会在该查询中添加另一个条件,如“AND value>500”?
select t.*
from YourTable t
inner join (
     select id, max(bdate) as maxbdate
     from YourTable
     group by id
) filter
    on t.id = filter.id
    and t.bdate = filter.maxbdate
id     bdate       value
38605  2009-04-23  6936575
38537  2009-04-22  81098692
28911  2009-04-24  7749594.67
SQL> SELECT ID,
  2         MAX(bdate) bdate,
  3         MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY bdate DESC) VALUE 
  4   FROM DATA
  5  GROUP BY ID;

        ID BDATE            VALUE
---------- ----------- ----------
     28911 24/04/2009  7749594,67
     38537 22/04/2009    81098692
     38605 23/04/2009     6936575