2015-11-06 30 views
0

我在下面寫的查詢給我所需的一切,除了相應的High_Water日期。基本上這個查詢做的很簡單。它在符號的整個生命週期中給出MAX值,但是我不確定如何寫入查詢,以便結果集將顯示具有MAX值的相應日期的第5列!將相應的日期添加到最大值

例如,如果一個符號X是在對數據庫2015年1月1日進入它包含的數據,直到今天(2015年11月6日)。我當前的查詢將找到符號X的MAX AUM,並且最大值在2015年6月1日。我需要查詢才能顯示06/01/2015的日期。基本上我需要查詢來查找MAX值和它的相應日期,以便我知道最大AUM的反映日期。

SELECT 
    A.SMBL, 
    B.MLTPL, 
    BEGINNING_DATE, 
    ROUND(max(AUM/1000000.00)) AS HIGH_WATER_AUM  
FROM 
    TBL1 A 
    JOIN TBL2 B ON A.SMBL = B.SMBL 
WHERE 
    A.SMBL IN = 'X' 
GROUP BY 
    A.SMBL, B.MLTPL, BEGINNING_DATE 
ORDER BY 
    SMBL 
+0

什麼是'IN' - >'其中A.SMBL IN ='X''試圖創建別名爲什麼不只是'='?爲什麼'按SMBL排序'如果都是'X'? –

+0

@JuanCarlosOropeza它需要訂購的原因,因爲在我的實際查詢中我使用了多於一個的符號。我只用'x'來確保查詢不顯得擁擠。 – ace123

回答

0

聽起來像是你需要KEEP首/末:

select a.smbl, 
     b.mltpl, 
     beginning_date, 
     round(max(aum/1000000.00)) as high_water_aum, 
     max(high_water_date) keep (dense_rank first order by aum desc) hw_dt_of_max_row 
from  tbl1 a 
     inner join tbl2 b on (a.smbl = b.smbl) 
where a.smbl = 'X' 
group by a.smbl, 
     b.mltpl, 
     beginning_date 
order by smbl; 

keep (dense_rank first order by aum desc)位做排序和最高AUM採摘的行(或多個)。 (如果需要,您可以將其重寫爲keep (dense_rank last order by aum))。

max(high_water_date)是否有多個行具有最高的aum值 - 它只是選擇最新的high_water_date來顯示。如果您願意的話,您可以將其更改爲min(high_water_date)


這裏說明的原理一個簡單的例子:

with sample_data as (select 1 id, 20 val1 from dual union all 
        select 2 id, 10 val1 from dual union all 
        select 3 id, 40 val1 from dual union all 
        select 4 id, 100 val1 from dual union all 
        select 5 id, 70 val1 from dual union all 
        select 6 id, 100 val1 from dual union all 
        select 7 id, 80 val1 from dual union all 
        select 8 id, 70 val1 from dual union all 
        select 9 id, 90 val1 from dual) 
select max(val1) max_val1, 
     max(id) keep (dense_rank first order by val1 desc) max_val1_max_id1, 
     max(id) keep (dense_rank last order by val1) max_val1_max_id2 
from sample_data; 

    MAX_VAL1 MAX_VAL1_MAX_ID1 MAX_VAL1_MAX_ID2 
---------- ---------------- ---------------- 
     100    6    6 
+0

我試過你提到的查詢,但是結果集是作爲不正確的日期而來的。我知道日期應該是什麼時候,並且當我用特定的符號對它進行測試時,日期就沒有問題了。另外我應該提到HIGH_WATER_DATE是一個虛假的名字。我們的符號經過NAV_DATE,基本上高水位的aum會有一個相應的日期,這個最大值發生在NAV_DATE,我將其假定爲HIGH_WATER_DATE。 – ace123

+0

也許如果您使用create table和insert樣例數據插入語句以及期望看到的輸出更新了您的問題,那麼我們將有更好的機會解決如何爲您提供幫助。 「我得到一個空的結果集」是什麼意思?我覺得很奇怪,只是在確切的情況下添加一列(除了糾正'a.smbl in ='X''語法錯誤)查詢你發佈導致沒有行被返回。 – Boneist

+0

對於溝通不暢,我表示歉意。我意識到我需要將符號編輯爲我實際使用的符號。但結果集顯示我的數據不正確。我編輯了原始問題。希望這可以幫助你們理解我正在尋找的東西!請注意,我已經擁有了我正在測試的一些符號所需的數據。我只是需要查詢才能正常工作,以便讓我在其他符號上運行它。 – ace123

0

只需創建一個ROW_NUMBER來選擇最上一行。

SELECT * 
FROM 
    (
     SELECT A.SMBL, 
      B.MLTPL, 
      BEGINNING_DATE, 
      ROUND(AUM/1000000.00) AS HIGH_WATER_AUM, 
      A.nav_date,  
      ROW_NUMBER() over 
       (PARTITION BY A.SMBL, B.MLTPL, BEGINNING_DATE ORDER BY AUM DESC) AS RN 
     FROM TBL1 A 
     JOIN TBL2 B 
     ON A.SMBL = B.SMBL 
     WHERE A.SMBL IN ('X','Y','Z') 
    ) t 
WHERE RN = 1 
ORDER BY SMBL 
+0

謝謝你們,你們能夠引導我走向正確的方向。我能夠完成結果集的查詢,正是我所需要的。我將很快發佈答案給我的查詢 – ace123

+0

閱讀你的答案後,我更新我的答案。請你可以試試嗎?使用row_number()比計算max()更有效,然後再次使用表進行查找。 –

+0

我剛剛運行了你寫的查詢,不幸的是它沒有給我正確的結果集。我會比較你的結果集和我的結果。 – ace123

0

這是我正在尋找的查詢。我給了我正在尋找的確切結果集。

SELECT A.SMBL, 
     B.MLTPL, 
     BEGINNING_DATE, 
     ROUND(MAX(c.AUM/1000000.00)) AS HIGH_WATER_AUM, 
     max(a.nav_date) AS HIGH_WATER_AUM 
FROM TBL1 A 
INNER JOIN TBL2 B 
     ON A.SMBL = B.SMBL 
INNER JOIN (
      SELECT SMBL, 
        max(AUM) AS AUM 
      FROM TBL1 
      GROUP BY symbol 
      ) c 
     ON A.SMBL = C.SMBL 
     AND c.AUM = a.AUM 
WHERE A.SMBL IN ('X','Y','Z') 
GROUP BY A.SMBL, 
     B.MLTPL, 
     BEGINNING_DATE 
ORDER BY SMBL 
0

@JuanCarlosOropeza。我一直在尋找的結果集是這個

SMBL MLTPL BEGINNING_DATE  MAX(A.NAV_DATE)  HIGH_WATER_AUM 
A  10 2008-12-01 00:00:00 2011-05-02 00:00:00   100 
B  10 2011-10-04 00:00:00 2013-11-27 00:00:00   600 
X  10 2008-11-24 00:00:00 2009-06-17 00:00:00   300 
Y  10 2008-11-24 00:00:00 2015-03-26 00:00:00   500 
Z  10 2008-12-01 00:00:00 2011-09-02 00:00:00   700 

結果集查詢給了我是

SMBL  MLTPL BEGINNING_DATE  MAX(A.NAV_DATE)  HIGH_WATER_AUM 
A  10 2008-12-01 00:00:00 2015-10-15 00:00:00   100 
B  10 2011-10-04 00:00:00 2015-10-15 00:00:00   600 
X  10 2008-11-24 00:00:00 2015-10-15 00:00:00   300 
Y  10 2008-11-24 00:00:00 2015-10-15 00:00:00   500 
Z  10 2008-12-01 00:00:00 2015-10-15 00:00:00   700 

你可以看到它的簡單分配日期所有不同的符號,即使他們的HIGHT_WATER_AUM實際上是在不同的日期。