更新每行中最旧日期的 table 列,除了最旧日期已经过去的地方?

Updating a table column with oldest date in each row, except where the oldest date has already passed?

我想更新 Date1 列的内容以反映每一行中最早的日期,除非日期已经过去(Date1 < current date), 在这种情况下,我希望 Date1 填充行中第二个最早的日期

为了增加上下文,table 有数千行和约 15 列,其中只有少数是日期。我过去曾使用 least 函数用每行中最旧的日期更新此列,但如果最旧的日期早于当前日期。

ID Date 1 Date 2 Date 3 Date 4
001 01/14/2022 01/15/2022 01/16/2022
002 04/15/2019 03/20/2021 06/16/2021

类似的东西。您需要进行修改,以便为 UPDATE 创建适当的 WHERE 条件。这显然在您的设置上未经测试,因此请尝试 test/expendable 数据。:

WITH dt AS 
    (SELECT unnest(ARRAY['11/02/2020'::date,  '12/31/2020'::date, '01/01/2021'::date]) AS dt_val) 
UPDATE 
    some_table
SET 
    dt1 = 
(SELECT 
    * 
FROM 
    dt 
WHERE 
    dt_val >= '12/30/2020'::date 
ORDER BY 
    dt_val 
LIMIT 1);

 dt_val   
------------
 12/31/2020

用字段名称替换 ARRAY 中的值的位置。该查询根据日期值创建一个数组,然后 unnest(s) 该数组来创建行。然后查找大于或等于目标日期的行值,其中行按日期值排序。结果限于 LIMIT 1.

最早的日期值

您想要今天或更晚的最早日期。您可以在没有子查询的情况下执行此操作,使用 least() 和条件表达式:

update mytable t
set date1 = least(
    case when date2 >= current_date then date2 end,
    case when date3 >= current_date then date3 end,
    case when date4 >= current_date then date4 end
)

case 表达式将“过去”日期转换为 nullleast() 忽略。

另一种方法是将列反透视为行,然后使用过滤和聚合:

update mytable t
set date1 = (
    select min(date)
    from (values (date2), (date3), (date4)) d(dt)
    where dt >= current_date
)