Postgres - 根据秒 table 有条件地更新指标变量
Postgres - conditional update an indicator variable based on a second table
我正在尝试根据原始 table 中的行是否属于某个日期 运行ge(在我的第二个 table - 债券到期日中指定)。
具体来说,我的第二个 table 提供了一个 ID 变量 (cusip_id) 和指定开始和结束日期的两列 (start_dt、end_dt)。如果 'trd_exctn_dt' 日期变量落在这个日期 运行ge 内,我需要在我的第一个 table 中用 '1' 填充 'ontherun' 变量,'0 ' 如果没有。
我已经尝试了很多方法,并且通过阅读许多线程认为使用 CASE 选项可能是正确的方法,但无法使它起作用。任何帮助将不胜感激。非常感谢。
UPDATE tracedetail a
SET on_the_run =
(CASE WHEN
(a.cusip_id = b.cusip_id)
AND (a.trd_exctn_dt::date >= b.start_dt::date)
AND (b.end_dt::date >= a.trd_exctn_dt::date)
THEN 1 ELSE 0 END)
FROM
(SELECT
cusip_id,
start_dt,
end_dt
FROM bondmaturity)
AS b;
抱歉 - 请忽略此问题。我相信我回答问题的正确方法是 运行 以下内容:
UPDATE tracedetail a
SET on_the_run = 1
FROM (SELECT cusip_id,
start_dt,
end_dt
FROM bondmaturity) AS b
WHERE a.cusip_id = b.cusip_id
AND a.trd_exctn_dt::date >= b.start_dt::date
AND b.end_dt::date >= a.trd_exctn_dt::date;
在此之后,我 运行 更新以使用值“0”填充 NULL 值
UPDATE tracedetail
SET on_the_run =
CASE WHEN on_the_run IS NULL THEN 0 ELSE on_the_run END;
您可以使用 EXISTS
子查询条件,它将 return 布尔类型 (TRUE/FALSE) 值。您必须将该值转换为相应的整数值 (1/0)。如果 on_the_run
字段已经是布尔类型而不是整数类型,那将是一个更好的设计。
UPDATE tracedetail a
SET on_the_run = EXISTS
(SELECT 1
FROM bondmaturity b
WHERE a.cusip_id = b.cusip_id
AND a.trd_exctn_dt::date >= b.start_dt::date
AND b.end_dt::date >= a.trd_exctn_dt::date
)::integer;
您可以考虑向您的一个或两个表添加触发器,这样 on_the_run
字段将在您的任何日期字段更新时自动更新。
我正在尝试根据原始 table 中的行是否属于某个日期 运行ge(在我的第二个 table - 债券到期日中指定)。
具体来说,我的第二个 table 提供了一个 ID 变量 (cusip_id) 和指定开始和结束日期的两列 (start_dt、end_dt)。如果 'trd_exctn_dt' 日期变量落在这个日期 运行ge 内,我需要在我的第一个 table 中用 '1' 填充 'ontherun' 变量,'0 ' 如果没有。
我已经尝试了很多方法,并且通过阅读许多线程认为使用 CASE 选项可能是正确的方法,但无法使它起作用。任何帮助将不胜感激。非常感谢。
UPDATE tracedetail a
SET on_the_run =
(CASE WHEN
(a.cusip_id = b.cusip_id)
AND (a.trd_exctn_dt::date >= b.start_dt::date)
AND (b.end_dt::date >= a.trd_exctn_dt::date)
THEN 1 ELSE 0 END)
FROM
(SELECT
cusip_id,
start_dt,
end_dt
FROM bondmaturity)
AS b;
抱歉 - 请忽略此问题。我相信我回答问题的正确方法是 运行 以下内容:
UPDATE tracedetail a
SET on_the_run = 1
FROM (SELECT cusip_id,
start_dt,
end_dt
FROM bondmaturity) AS b
WHERE a.cusip_id = b.cusip_id
AND a.trd_exctn_dt::date >= b.start_dt::date
AND b.end_dt::date >= a.trd_exctn_dt::date;
在此之后,我 运行 更新以使用值“0”填充 NULL 值
UPDATE tracedetail
SET on_the_run =
CASE WHEN on_the_run IS NULL THEN 0 ELSE on_the_run END;
您可以使用 EXISTS
子查询条件,它将 return 布尔类型 (TRUE/FALSE) 值。您必须将该值转换为相应的整数值 (1/0)。如果 on_the_run
字段已经是布尔类型而不是整数类型,那将是一个更好的设计。
UPDATE tracedetail a
SET on_the_run = EXISTS
(SELECT 1
FROM bondmaturity b
WHERE a.cusip_id = b.cusip_id
AND a.trd_exctn_dt::date >= b.start_dt::date
AND b.end_dt::date >= a.trd_exctn_dt::date
)::integer;
您可以考虑向您的一个或两个表添加触发器,这样 on_the_run
字段将在您的任何日期字段更新时自动更新。