2009-11-04 71 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建議(無自連接,對數據的單次)的分析方法,有效