我试图根据原始表中的行是否属于某个日期范围(在我的第二个表中指定 - bondmaturity)来有条件地填充原始表(tracedetail)中的指示符(1/0)列。 / p>
具体来说,我的第二个表提供了一个ID变量(cusip_id)和两个指定开始和结束日期(start_dt,end_dt)的列。如果'trd_exctn_dt'日期变量落在特定ID的此日期范围内,我需要在我的第一个表中填充'ontherun'变量为'1',如果不是,则需要'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;
答案 0 :(得分:0)
您可以使用EXISTS
子查询条件,该条件将返回布尔类型(TRUE / FALSE)值。您必须将值转换为相应的整数值(1/0)。如果on_the_run
字段已经是boolean类型而不是整数,那将是一个更好的设计。
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
字段。