Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres-基于第二个表有条件地更新指标变量_Postgresql_Sql Update_Conditional Statements_Postgresql 9.3 - Fatal编程技术网

Postgresql Postgres-基于第二个表有条件地更新指标变量

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选项可

我试图根据原始表中的行是否在某个日期范围内(在第二个表-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字段。