Postgresql Postgres-基于第二个表有条件地更新指标变量
我试图根据原始表中的行是否在某个日期范围内(在第二个表-bondmaturity中指定),有条件地填充原始表(tracedetail)中的指示符(1/0)列 具体地说,我的第二个表提供了一个ID变量(cusip_ID)和两列,用于指定开始和结束日期(start_dt,end_dt)。如果“trd_exctn_dt”日期变量在特定ID的此日期范围内,我需要用“1”填充第一个表中的“ontherun”变量,如果不在,则使用“0” 我已经尝试了很多方法,从阅读了大量的线程来看,我认为使用CASE选项可能是正确的方法,但无法实现这一点。任何帮助都将不胜感激。非常感谢Postgresql Postgres-基于第二个表有条件地更新指标变量,postgresql,sql-update,conditional-statements,postgresql-9.3,Postgresql,Sql Update,Conditional Statements,Postgresql 9.3,我试图根据原始表中的行是否在某个日期范围内(在第二个表-bondmaturity中指定),有条件地填充原始表(tracedetail)中的指示符(1/0)列 具体地说,我的第二个表提供了一个ID变量(cusip_ID)和两列,用于指定开始和结束日期(start_dt,end_dt)。如果“trd_exctn_dt”日期变量在特定ID的此日期范围内,我需要用“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”填充空值
UPDATE tracedetail
SET on_the_run =
CASE WHEN on_the_run IS NULL THEN 0 ELSE on_the_run END;
您可以使用
EXISTS
子查询条件,该条件将返回布尔类型(真/假)值。您必须将该值转换为相应的整数值(1/0)。如果运行字段上的已经是布尔类型而不是整数类型,那么这将是一个更好的设计
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;
您可以考虑将一个触发器添加到一个或两个表中,以便在更新任何日期字段时自动更新<代码> OnththyRun字段。