【问题标题】:UPDATE where timestamp is the latest更新时间戳是最新的
【发布时间】:2011-06-09 07:04:49
【问题描述】:

我有一组记录除了时间戳之外都具有相同的数据(是的,不是我的设计)

例子:

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...

现在我想用最新的时间戳更新记录。这是我正在尝试但还没有运气的方法:

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

ORDER BY 抛出语法错误。

我认为它应该是一个 AND 条件,但不知道如何。有什么想法吗?

PostgreSQL 是我的数据库。

【问题讨论】:

    标签: sql postgresql logic conditional-statements


    【解决方案1】:

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

    【讨论】:

    • 谢谢,忘了嵌套选择,哎呀
    • 请注意,当多行具有相同的时间戳值时(例如,单个事务中的多个now() 调用),这将删除 多个 行。此外,您应该使用 = (平等)而不是 IN 运算符。请务必告知人们您的解决方案可能存在的任何警告。
    【解决方案2】:
    UPDATE  mytable
    SET     user = 'TESTING'
    WHERE   ctid =
            (
            SELECT  ctid
            FROM    mytable
            WHERE   record_id = 1
            ORDER BY
                    tmstmp DESC
            LIMIT 1
            )
    

    这将正确处理tmstmp 上的重复项(如果有)。

    【讨论】:

    • 我真是太傻了。我删除了我的答案。
    【解决方案3】:

    使用 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
    

    您可以在 DO 块(从 9.0 版开始)或函数中执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2023-04-09
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多