UPDATE-Zeilen mit den Werten aus der gleichen Tabelle
Ich habe eine Tabelle wie diese:
+------+-------+
|ID | value |
+------+-------+
| 1 | 150 |
| 2 | |
| 3 | |
| 4 | |
| 5 | 530 |
| 6 | 950 |
| 7 | 651 |
+-------+------+
Ich soll Kopie der letzten 3 Werte und am Ende meiner Tabelle wird wie folgt Aussehen:
+------+-------+
|ID | value |
+------+-------+
| 1 | 150 |
| 2 | 530 |
| 3 | 950 |
| 4 | 651 |
| 5 | 530 |
| 6 | 950 |
| 7 | 651 |
+-------+------+
Ist es möglich?
InformationsquelleAutor Farhad Irani | 2012-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden self-join:
Wenn es Lücken in den ID-Raum, verwenden Sie die windows-Funktion
row_number()
um gapless-ID, mit zu arbeiten. Ich Mach das in einem Allgemeinen Tabellenausdruck, denn ich werde die eine Wiederverwendung der Tabelle zweimal für einen self-join:Müssen Sie PostgreSQL 9.1 oder später für Daten-Modifikation, die Allgemeine Tabellenausdrücke.
Sie nicht brauchen, PostgreSQL 9.1 oder höher ausgeführt
WITH x AS ( SELECT...) UPDATE mytable SET ... FROM x
. Daten-ändern von CTEs eigentlichUPDATE INSERT DELETE
imWITH
Teil. So etwas wieWITH x as (DELETE FROM t1 ... RETURNING t1.id) INSERT INTO t2 SELECT x.id FROM x
Deine Aussage ist falsch, meine Antwort ist korrekt. Gut, der Begriff "Daten-ändern von CTE" scheint ein wenig irreführend, da das CTE selbst nicht ändern von Daten. Die key-Anweisung in der Anleitung ist:
The sub-statements in WITH are executed concurrently with each other and with the main query.
Entweder Weg, müssen Sie die PostgreSQL-9.1 die Verwendung jeglicher Daten,-modifizieren-Befehl in direkten Zusammenhang mit einer CTE. Betrachten Sie diese demo: sqlfiddle.com/#!11/53063/1.Sorry. Ich bin mit beiden 9.2 und 8.4 in der Produktion und war verwirrt. + I ' V Lesen Sie die Bedienungsanleitung. In "7.8.2. Data-Modifying Statements in WITH" es ist immer
UPDATE INSERT DELETE
imWITH
Teil, so dachte ich, es ist über die Modifikation der Daten in das CTE selbst (WITH
Teil).InformationsquelleAutor Erwin Brandstetter
Für ein ad-hoc-update wie dieses, gibt es wahrscheinlich nicht gehen, um einen besseren Weg als drei einfache update-Anweisungen:
Die Frage ist, ist dies eine ad-hoc-Aktualisierung, die nur für diese genauen Daten, oder ein Fall von einem Allgemeinen update-Regel, die Sie implementieren möchten, die für alle möglichen Daten in die Tabelle? Wenn dem so ist, dann brauchen wir mehr Details.
So... wir brauchen mehr Informationen. Sie haben gesagt, Sie möchten, kopieren Sie die letzten 3 Werte. Ist es immer die Werte aus den letzten drei Zeilen bestellt
id
? Sind Sie immer kopieren Sie Sie auf Zeilen mit leeren Werten? Wie funktioniert jede Zeile zugewiesen bekommen einen der letzten 3 Werte?Nein, es ist nicht 3. mindestens 2000 Datensätze. ja, Sie sind bestellt von id. ja, ich bin kopieren von Zeilen mit leeren Werten.
InformationsquelleAutor Edmund
Hart codiert
3
erscheint zweimal und wird ersetzt durch jedoch viele Zeilen, die Sie wollen. Es geht den letzten3
Datensätze tatsächlich haben Werte. Er nimmt diese Werte und wendet Sie in der Folge zu der Gruppe der Datensätze mit null-Werten.InformationsquelleAutor Glenn