Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: Analytics/update question

Re: Analytics/update question

From: Maxim Demenko <mdemenko_at_gmail.com>
Date: Tue, 27 Sep 2005 22:08:27 +0200
Message-ID: <dhc8rd$okp$00$1@news.t-online.com>


Barbara Boehmer schrieb:
> Or, using the lag analytic function:
>
> scott_at_ORA92> SELECT * FROM your_table
> 2 /
>
> ID VALUE DATE_COL
> ---------- ---------- ---------
> 1 -999.99 26-sep-05
> 1 16.7 23-sep-05
> 1 8.9 22-sep-05
> 2 12.7 23-sep-05
> 2 12.8 20-sep-05
> 3 -999.99 19-sep-05
> 3 44 15-sep-05
> 3 76 14-sep-05
>
> 8 rows selected.
>
> scott_at_ORA92> UPDATE your_table o
> 2 SET o.value =
> 3 (SELECT i.lag_val
> 4 FROM (SELECT id, value, date_col,
> 5 LAG (value) OVER
> 6 (PARTITION BY id
> 7 ORDER BY date_col) AS lag_val
> 8 FROM your_table) i
> 9 WHERE i.id = o.id
> 10 AND i.value = o.value
> 11 AND i.date_col = o.date_col)
> 12 WHERE o.value = -999.99
> 13 /
>
> 2 rows updated.
>
> scott_at_ORA92> SELECT * FROM your_table
> 2 /
>
> ID VALUE DATE_COL
> ---------- ---------- ---------
> 1 16.7 26-sep-05
> 1 16.7 23-sep-05
> 1 8.9 22-sep-05
> 2 12.7 23-sep-05
> 2 12.8 20-sep-05
> 3 44 19-sep-05
> 3 44 15-sep-05
> 3 76 14-sep-05
>
> 8 rows selected.
>

<quote>
For any ID, if it's latest value is -999.99 I want to update its value to the value from its previous date
</quote>

I think this statement will update every -999.99 to his predecessor To update only if the -999.99 is the *latest within the group of id's* , i would slightly modify it:

UPDATE (
SELECT id, value, date_col,
LAG (value) OVER (PARTITION BY ID ORDER BY date_col, id DESC) AS lag_val, row_number() OVER (PARTITION BY ID ORDER BY date_col, id DESC) AS row_num, COUNT(*) OVER (PARTITION BY ID ) AS count_in_group FROM your_table
)
SET value = lag_val
WHERE value = -999.99
AND row_num = count_in_group;

Best regards

Maxim Received on Tue Sep 27 2005 - 15:08:27 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US