簡體   English   中英

查詢中的多個最大值

[英]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

這將與Majkel建議的分析方法一樣高效(沒有自聯接 ,單次傳遞數據)

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM