Oracle
select id
,round
(
min (field1) keep (dense_rank last order by field3)
/ nullif (min (field1) keep (dense_rank first order by field3),0)
- 1
,4
) as fieldnew
from mytable
where field3 in
(
add_months (trunc (current_date,'mm'),-2)
,add_months (trunc (current_date,'mm'),-1)
)
group by id
;
or
select id
,round
(
min (case when field3 = add_months (trunc (current_date,'mm'),-1) then field1 end)
/ nullif (min (case when field3 = add_months (trunc (current_date,'mm'),-2) then field1 end),0)
- 1
,4
) as fieldnew
from mytable
where field3 in
(
add_months (trunc (current_date,'mm'),-2)
,add_months (trunc (current_date,'mm'),-1)
)
group by id
;
+----+----------+
| ID | FIELDNEW |
+----+----------+
| 1 | 0.75 |
+----+----------+
| 2 | 0.5 |
+----+----------+
| 5 | 0.7368 |
+----+----------+
Teradata
select id
,1.0000
* last_value (field1) over
(
partition by id
order by field3
rows between unbounded preceding
and unbounded following
)
/ nullifzero (field1)
- 1 as fieldnew
from mytable
where field3 = td_month_begin (current_date) - interval '2' month
or field3 = td_month_begin (current_date) - interval '1' month
qualify field3 = min (field3) over (partition by id)
;
or
select id
,1.0000
* min (field1) over
(
partition by id
order by field3
rows between 1 following
and 1 following
)
/ nullifzero (field1)
- 1 as fieldnew
where field3 = td_month_begin (current_date) - interval '2' month
or field3 = td_month_begin (current_date) - interval '1' month
from mytable
qualify field3 = min (field3) over (partition by id)
;
+----+----------+
| Id | fieldnew |
+----+----------+
| 1 | 0.7500 |
+----+----------+
| 2 | 0.5000 |
+----+----------+
| 5 | 0.7368 |
+----+----------+
oracletag as you explicitly state Teradata in your question - a_horse_with_no_name