我在下面写的查询给了我所需的一切,除了相应的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
答案 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实际上是在不同的日期。