【问题标题】:How can I use sql db2 update function?如何使用 sql db2 更新功能?
【发布时间】:2020-05-05 19:58:40
【问题描述】:

我有一个获取现有数据表信息的 sql db2 代码,我想将其修改为不下载从 2020-02-01 开始的数据,而是每天更新此表。请帮我修改这个脚本,不要为了更新而一遍又一遍地检索整个数据,而是每天只更新新数据。

create table public.fc_TDPMean_By_DIM2_EtchDate as 
select DIM2_EtchDate, Model, tool_id, avg(TDPower) as TDPower_Mean, count(slider_id)
from (select distinct a.slider_id, trunc(a.test_date_time), left(a.product_id,2) as Model, a.wafer_id, a.row_number, 
a.column_number, a.x_coordinate, a.y_coordinate, a.error_code, a.grade, a.bin,
a.TFCTDPWR as TDPower, b.job_number, trunc(c.transaction_date_time) as DIM2_EtchDate, c.tool_id
from ah.param_jade_wide a left join ah.param_lap_summary b on a.wafer_id = b.wafer_id and a.row_number = b.row_number
left join ah.his_job c on c.job_number = b.job_number
where c.transaction_date_time > '2020-02-01'
and left(a.product_id,2) in ('L2','L3','L8','C3','C2','V8')
and b.source_system_code in ('MFG2.SLDR.LAPRUN')
and c.operation_id in ('545600')
and a.retest_number = 0
and a.class_description in ('PROD')
and not c.tool_id = 0 and not c.tool_id in ('') )
group by DIM2_EtchDate, Model, tool_id;
commit;

【问题讨论】:

  • “每天更新此表”的具体规则是什么?执行此操作的能力取决于所有这 3 个表的数据更改性质。你确定你的选择,比如说,date(c.transaction_date_time) = some_previous_date 条件总是返回相同的数据,不管你在这个some_previous_date 日期之后运行它的时间吗?换句话说,您对这些表有任何回溯更新吗?
  • 我只是每天运行它来更新我的数据,因为它总是得到大于日期。由于每天都在创建表public.fc_TDPMean_By_DIM2_EtchDate,所以我只想今天获取数据并将其更新到表public.fc_TDPMean_By_DIM2_EtchDate。我是 db2 的新手,我不知道如何才能更新它而不是每天创建表。

标签: sql db2


【解决方案1】:

因为您想每天添加一个新的“日”条目(因为 DIM2_EtchDate == DATE(c.transaction_date_time) 是汇总表的一部分),并且如果您可以不选择“今天的”条目, 您可以对“昨天和之前”条目使用简单的 INSERT,每天运行如下:

INSERT INTO public.fc_TDPMean_By_DIM2_EtchDate
  SELECT DIM2_EtchDate, Model, tool_id, avg(TDPower) AS TDPower_Mean, count(slider_id)
    FROM (SELECT DISTINCT a.slider_id, LEFT(a.product_id,2) as Model, 
a.TFCTDPWR AS TDPower, TRUNC(c.transaction_date_time) as DIM2_EtchDate, c.tool_id
-- (I got rid of not used columns.)
            FROM ah.param_jade_wide a
              LEFT JOIN ah.param_lap_summary b ON (a.wafer_id, a.row_number) = (b.wafer_id, b.row_number)
              LEFT JOIN ah.his_job c ON c.job_number = b.job_number
            WHERE c.transaction_date_time > '2020-02-01' --MAX(DIM2_EtchDate)
              AND c.transaction_date_time < CURRENT DATE
              AND LEFT(a.product_id,2) IN ('L2','L3','L8','C3','C2','V8')
              AND b.source_system_code IN ('MFG2.SLDR.LAPRUN')
              AND c.operation_id IN ('545600')
              AND a.retest_number = 0
              AND a.class_description IN ('PROD')
              AND NOT c.tool_id = 0 AND NOT c.tool_id in ('')
         )
    GROUP BY DIM2_EtchDate, Model, tool_id
-- WITH appropriate isolation
;

(我还没有测试过。如果 c.transaction_date_time 是 DATE,这应该可以工作。如果是 TIMESTAMP,那么 c.transaction_date_time &gt; '2020-02-01' 将更改为 c.transaction_date_time &gt;= TIMESTAMP('2020-02-01', '00:00') + 1 DAY。)

如果您希望每天更新一次以上,并且今天的数据也不完整,可以使用 MERGE 来完成。如果是这样,请告诉我,我可以设法为它写一个 MERGE。 (或者你可以,那样会更好。)

【讨论】:

  • 您好 Pavol 爵士,这太棒了。如果不是太多,是的,请给我写合并代码。
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多