2011-01-14 7 views
3

ich eine Gruppe von Datensätzen alle mit den gleichen Daten mit Ausnahme der Zeitstempel haben (Ja, nicht mein Design)UPDATE wo Zeitstempel ist die neueste

Beispiel:

record_id, user, tmstmp 
1, myself, 2006-11-15 09:56:14.325882-05 
1, myself, 2006-11-15 09:56:19.051823-05 
1, myself, 2006-11-15 11:23:30.581366-05 
etc... 

Nun möchte Ich mag die UPDATE Rekord mit dem spätesten Zeitstempel. Hier ist, was ich ohne Glück bin versucht noch:

UPDATE tbl 
SET user = 'TESTING' 
WHERE record_id = 1 
ORDER BY tmstmp DESC 
LIMIT 1 

Die ORDER BY den Syntaxfehler führt.

Ich denke, es sollte eine UND-Bedingung sein, aber nicht zu sehen, wie. Irgendwelche Gedanken?

PostgreSQL ist mein db.

Antwort

3

UPDATE tbl SET user = 'TESTING'
WHERE record_id = 1
AND tms_tmp in (select max(tms_tmp) from tbl where record_id = 1)

+0

Danke, vergessen verschachtelte Auswahlen, Sheesh –

+1

Beachten Sie, dass dies ** mehrere ** Zeilen löschen wird, wenn mehrere Zeilen mit dem gleichen Zeitstempel Wert (z. B. mehrere 'now()' Anrufe in einer einzigen Transaktion). Außerdem sollten Sie '=' (Gleichheit) und nicht den 'IN'-Operator verwenden. Es ist wichtig, dass Sie die Mitarbeiter über eventuelle Vorbehalte informieren, die Ihre Lösungen haben könnten. – intgr

2
UPDATE mytable 
SET  user = 'TESTING' 
WHERE ctid = 
     (
     SELECT ctid 
     FROM mytable 
     WHERE record_id = 1 
     ORDER BY 
       tmstmp DESC 
     LIMIT 1 
     ) 

Diese Duplikate korrekt auf tmstmp behandelt, falls vorhanden.

+0

Ist das nicht meine Antwort? –

+2

@goreSplatter: Nein. – Quassnoi

+0

Das war wirklich dumm von mir. Ich habe meine Antwort gelöscht. –

0

Mit PL/pgsql:

DECLARE 
    cur CURSOR(key int) FOR 
    SELECT * FROM tbl WHERE tbl.record_id = key ORDER BY tmstmp DESC FOR UPDATE; 
BEGIN 
    OPEN cur(1); -- record_id 
    MOVE NEXT FROM cur; 
    UPDATE tbl SET "user" = 'TESTING' WHERE CURRENT OF cur; 
    CLOSE cur; 
END 

Sie können diesen Block in einer DO tun (ab Version 9.0) oder eine Funktion.