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 字段将在您的任何日期字段更新时自动更新。