将相应的日期添加到最大值

时间:2015-11-06 16:29:35

标签: sql oracle date

我在下面写的查询给了我所需的一切,除了相应的High_Water日期。基本上这个查询正在做的很简单。它在符号的整个生命周期中给出了MAX值但是我不确定如何写入查询,以便结果集显示第5列,其中包含MAX值的相应日期!

例如,如果在2015年1月1日在数据库中输入了符号X,并且它包含截至今天(2015年6月11日)的数据。我当前的查询将找到符号X的MAX AUM,最大值是06/01/2015。我需要我的查询才能告诉我06/01/2015的日期。基本上我需要查询来查找MAX值及其相应的日期,以便我知道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

4 个答案:

答案 0 :(得分:0)

听起来你需要保持第一个/最后一个:

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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实际上是在不同的日期。