SQL : replace value if zero with last value in column

Alex2000

Benutzer
Beiträge
9
Hallo,

i have a table with three columns :

person_id FS value
----------- ----- ---------
50566 1 20
50566 2 40
50566 3 0
50566 4 0
50566 5 70

I want that when the 'value' is zero then it should be replaced with the 'value' directly previous to it in that column . So, in the example above , the 'value' in the 3rd and 4th rows should be replaced with 40 , how to do that in sql ?
Any help would be appreciated.
Thanks a lot in advance.

Alex
 
Werbung:
Welcome Alex, here is a german forum, but to tell you how it works by hand... (not automatically)

Code:
update table set value = 40 where value = 0;

EDIT:
Excuse me... is also not working on my own database =/

EDIT2:
It works... have used to wrong column-names =/
 
Zuletzt bearbeitet:
Du suchst nach einem Statement welches den Datensatz für eine bestimmte person_id findet, des FS den größten Wert hat kleiner ist als der Datensatz den Du betrachtest und dessen Spalte "value" einen Wert größer als 0 hat.

Code:
update person p
  set value = (select value
               from person pv 
               where pv.fs < p.fs       
                 and pv.person_id = p.person_id
                 and pv.value > 0
                 and p.value = 0
               order by pv.fs desc
               limit 1)  
where p.value = 0

Falls es keinen solchen (vorherigen) Datensatz gibt, wird mein UPDATE Statement, value auf NULL setzen. Falls Du das berücksichtigen musst, brauchst Du noch ein zusätzliches WHERE EXISTS was prüft ob es auch wirklich einen "Vorgänger" gibt (im Prinzip ist das eine Wiederholung des Sub-Selects)
 
One thing is not clear to me, do you want to set those values using UPDATE and change the content of the table or alter a SELECT statement to fill up those NULLs while reading the table? In the first case, you are good with @castorps code.
 
mal eine Lösung für die SELECT-Variante:

Code:
postgres=# select * from alex2000 ;
 person_id | fs | val 
-----------+----+-----
     50566 |  1 |  20
     50566 |  2 |  40
     50566 |  3 |   0
     50566 |  4 |   0
     50566 |  5 |  70
(5 rows)

postgres=# select a1.person_id, a1.fs, greatest(a1.val, a2.val) from alex2000 a1 left join lateral (select * from alex2000 a2 where a2.fs < a1.fs and a2.val > 0 order by a2.fs desc limit 1) a2 on true; 
 person_id | fs | greatest 
-----------+----+----------
     50566 |  1 |       20
     50566 |  2 |       40
     50566 |  3 |       40
     50566 |  4 |       40
     50566 |  5 |       70
(5 rows)

postgres=#

Falls es mehrere untersch. person_id gibt und die FS-Zählung je person_id ist müßte das noch etwas angepaßt werden - überlasse ich Dir zur Übung.
 
Werbung:
Hallo Castrop , hallo alle ,

vielen lieben Dank Castrop ! Dein Code hat ohne Anpassung für mich sehr gut funktioniert. Nochmal besten Dank ! :)

LG
Alex
 
Zurück
Oben