2009-11-04 43 views
6

我知道标题听起来不是很描述性的,但它是我能想到的最好的:多最大值

我有这个表

 
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 

这实际上是一个非常复杂的查询封装在视图中,但现在不属于这个问题。

我想为每个ID,包含最高BDate的行。在这个例子中,这将是结果。

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

我已经尝试

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

但随后返回所有行,因为每个值collumn是不同的。这个查询是在Oracle v10中设计的,我有资格只使用select查询而不是创建过程。

+0

感谢所有回答家伙。 – kurast 2009-11-04 16:44:31

+0

暗黑破坏神II - 库拉斯特码头? – CheeseConQueso 2009-11-04 17:23:34

+0

是的,我的名字来自暗黑破坏神II。库拉斯特码头。 发音时库拉斯特这个词听起来很棒,我不忍心使用它。 – kurast 2009-11-04 21:27:36

回答

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

你会如何为该查询添加另一个条件 - 比如'AND value> 500'? – kerosene 2016-05-26 07:48:52

0
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 
+0

它不返回数值列表,我想 – kurast 2009-11-04 13:46:47

+0

修正了这个问题。当然,未经测试。 – 2009-11-04 13:48:13

0
SELECT id, bdate, value FROM myview 
WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id) 

(未经测试...我没有甲骨文提供现在...)

2

您可以使用分析:

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

您可以使用INNER JOIN只筛选出最大行数:

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。

8

可以使用MAX...KEEP(DENSE_RANK FIRST...)结构:

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 

这将是由Majkel建议(无自连接,对数据的单次)的分析方法,有效