更新每行中最旧日期的 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
表达式将“过去”日期转换为 null
,least()
忽略。
另一种方法是将列反透视为行,然后使用过滤和聚合:
update mytable t
set date1 = (
select min(date)
from (values (date2), (date3), (date4)) d(dt)
where dt >= current_date
)
我想更新 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
表达式将“过去”日期转换为 null
,least()
忽略。
另一种方法是将列反透视为行,然后使用过滤和聚合:
update mytable t
set date1 = (
select min(date)
from (values (date2), (date3), (date4)) d(dt)
where dt >= current_date
)