Ich habe eine Tabelle in Postgres, die wie folgt aussieht:Wie kann ich den vorherigen Wert ungleich Null effizient auswählen?
# select * from p;
id | value
----+-------
1 | 100
2 |
3 |
4 |
5 |
6 |
7 |
8 | 200
9 |
(9 rows)
Und ich würde abfragen möchte es wie folgt aussehen:
# select * from p;
id | value | new_value
----+-------+----------
1 | 100 |
2 | | 100
3 | | 100
4 | | 100
5 | | 100
6 | | 100
7 | | 100
8 | 200 | 100
9 | | 200
(9 rows)
ich dies bereits mit einer Unterabfrage tun können, in die Auswahl, aber in meinen realen Daten habe ich 20k oder mehr Zeilen und es wird ziemlich langsam.
Ist dies in einer Fensterfunktion möglich? Ich würde liebend gerne lag(), aber es scheint nicht die IGNORE NULLS Option zu unterstützen.
select id, value, lag(value, 1) over (order by id) as new_value from p;
id | value | new_value
----+-------+-----------
1 | 100 |
2 | | 100
3 | |
4 | |
5 | |
6 | |
7 | |
8 | 200 |
9 | | 200
(9 rows)
+1 ... Dies ist eine wirklich clevere Lösung, auch ein Index für 'id' und 'value' verbessert die Performance. – MatheusOl
Große Lösung für mich im Jahr 2015! – Chris
Sie können 'count (value)' anstelle von 'sum (case ...)' verwenden, da count Nullen ignoriert. – shaunc