[英]Multiple max values in a query
我知道標題聽起來不是很具描述性,但它是我能想到的最好的:
我有這張桌子
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
但隨后它返回所有行,因為每個行的值不同。 此查詢是在Oracle v10中設計的,我有資格僅使用選擇查詢而不是創建過程。
我們可以在IN子句中使用乘法列:
select id, bdate, value
from myview
where (id, bdate) in
(select id, max(bdate)
from myview group by id)
/
你可以使用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
您可以使用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
請注意,這將為id返回多行,該id具有多個具有相同bdate的值。
您可以使用分析:
select
id, bdate, value
from
(
select
id, bdate, value, max( bdate ) over ( partition by id ) max_bdate
from
myview
)
where
bdate = max_bdate
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
SELECT id, bdate, value FROM myview
WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id)
(未經測試......我現在沒有Oracle可用...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.