Postgres:用最低值更新列

时间:2020-08-18 07:16:43

标签: postgresql

我想创建一个具有以下结构的表(last_seen [1,2]是时间戳):

EVENT_ID | last_seen1 | last_seen2
-----------------------------------
    2    |   120660   | 123400

我想知道事件发生的最近2次。以传统的方式,我应该将最新的时间戳记保存在last_seen1中,并将较旧的值写入last_seen2中。当一个新事件到来时,我必须将值从last_seen1移至last_seen2并在last_seen1中写入一个新值。

但是我不知道是否可以执行以下操作:当EVENT_ID = 2再次出现时,我想更新具有最低值的列。我不知道WHERE是最早的时间戳,查询应该以一种非常聪明的方式编写,它将发现具有最低值的列的名称(在两个候选列之间:last_seen1,last_seen2)。

从这样的表中读取数据很简单,因为我可以在last_seen [1,2]中使用值的MIN或MAX。 但是,如果可能的话,如何创建一个查询来写入具有最低值的列? 我的意思是,我不知道我要写的列的名称:可以是last_seen1或last_seen2。

2 个答案:

答案 0 :(得分:1)

您可以为此使用CASE WHEN表达式的逻辑,并记住用它自己覆盖值是无害的:

UPDATE mytable
SET last_seen1 = CASE WHEN last_seen1 < last_seen2 THEN 'newvalue' ELSE last_seen1 END,
    last_seen2 = CASE WHEN last_seen1 < last_seen2 THEN last_seen2 ELSE 'newvalue' END
WHERE event_id = 2

答案 1 :(得分:0)

您可以使用至少来获取值:

SELECT LEAST(last_seen1, last_seen2) FROM  t WHERE event=2

或使用 GREATEST

UPDATE t SET last_seen1=LEAST(last_seen1, last_seen2), last_seen2=GREATEST(last_seen1, last_seen2) WHERE event=2;

或具有所需的 newvalue

UPDATE t SET last_seen1=LEAST(last_seen1, last_seen2, newvalue), last_seen2=GREATEST(last_seen1, last_seen2, newvalue) WHERE event=2;