【问题标题】:logic for the Update statement in TeradataTeradata 中更新语句的逻辑
【发布时间】:2014-09-05 03:03:05
【问题描述】:

这是我通过引导函数尝试过的输出,我刚刚得到了结果,但我需要更新表格,如下所示。 任何人都可以分享我尝试过的日志,但没有运气谢谢

这是我的输出,需要一个更新逻辑来更新基于 effout_date 的记录 但我想更新表中存在的记录

MFG_DATE 的第 5 条记录 - 2014 年 6 月 30 日更新为 effout_date 的第 4 条记录 - 2014 年 6 月 30 日和 MFG_DATE - 29-Jun-14 的第 4 条记录更新为数据 effout_date - 29-Jun-14 的第 3 条记录 MFG_DATE - 5-Jun-14 的第 3 条记录更新为数据 effout_date - 5-Jun-14 的第 2 条记录

DROP TABLE t_plant;
Create MULTISET Table  t_plant
( 
plant_no INTEGER NOT NULL
,plant_Name CHAR(9) 
,part1 CHAR(9) 
,part2 CHAR(9) 
,part3 CHAR(9) 
,mfg_date DATE FORMAT 'YY/MM/DD'
,effout_date DATE FORMAT 'YY/MM/DD'
,currency CHAR(9)  
);
INSERT INTO t_plant
VALUES( 1,'Detroit','A11','B22','C33',TO_DATE(  '2014-02-01', 'YYYY-MM-DD') ,  TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 2,'Detroit','A11','B22','C33',TO_DATE(  '2014-03-01', 'YYYY-MM-DD') ,  TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 3,'Detroit','A11','B22','C33', TO_DATE(  '2014-06-05', 'YYYY-MM-DD'),   TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 3,'Detroit','A11','B22','C33',  TO_DATE( '2014-06-05', 'YYYY-MM-DD') , TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 4,'Detroit','A11','B22','C33', TO_DATE(  '2014-06-29', 'YYYY-MM-DD'),   TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 5,'Detroit','A11','B22','C33', TO_DATE(  '2014-06-30', 'YYYY-MM-DD'),   TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 6,'INDIA','A10','B20','C30', TO_DATE(  '2014-05-15', 'YYYY-MM-DD') ,  TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 7,'INDIA','A10','B20','C30', TO_DATE(  '2014-05-15', 'YYYY-MM-DD') ,  TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');
INSERT INTO t_plant
VALUES( 8,'INDIA','A10','B20','C30', TO_DATE(  '2014-06-30', 'YYYY-MM-DD') ,  TO_DATE( '9999-12-31', 'YYYY-MM-DD'),'USD');

SELECT plant_Name,part1, part2, part3, mfg_date
      ,COALESCE(  MIN(mfg_date)
           OVER(PARTITION BY  plant_Name,PART1, part2, part3  ORDER BY mfg_date
             ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING )
                 ,CAST('9999-12-31'AS DATE) ) AS effout_date_Lead_COALESCE --Tomorrow
 FROM   t_plant
 GROUP BY  plant_Name,PART1, PART2, PART3, mfg_date ;

Select * FROM   t_plant Order by part1, part2, part3, mfg_date;

这是我通过引导函数尝试过的输出,我刚刚得到了结果,但我需要更新表格,如下所示。 任何人都可以分享我尝试过的日志,但没有运气谢谢

Select t_plant_1.* , t_plant_2.effout_date
From  t_plant t_plant_1
,
(
SELECT plant_Name,PART1, PART2, PART3, mfg_date  
      ,COALESCE(  MIN(mfg_date)
            OVER(PARTITION BY  plant_Name,PART1, PART2, PART3  ORDER BY mfg_date
                        ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING )
                        ,CAST('9999-12-31'AS DATE)  ) AS effout_date --Lead_COALESCE
 FROM   t_plant
 GROUP BY  plant_Name,PART1, PART2, PART3, mfg_date      
 ) t_plant_2
Where  t_plant_1.plant_Name = t_plant_2.plant_Name
and t_plant_1.PART1 = t_plant_2.PART1
and t_plant_1.PART2 = t_plant_2.PART2
and t_plant_1.PART3 = t_plant_2.PART3
and t_plant_1.mfg_date = t_plant_2.mfg_date
Order by   t_plant_1.plant_Name,t_plant_1.PART1 ,t_plant_1.PART2,t_plant_1.PART3,t_plant_1.mfg_date 

输出/输出

   plant_no plant_Name  part1           part2          part3            mfg_date    effout_date_lead currency
1   1   Detroit     A11         B22         C33         2/1/2014    3/1/2014    USD      
2   2   Detroit     A11         B22         C33         3/1/2014    6/5/2014    USD      
3   3   Detroit     A11         B22         C33         6/5/2014    6/29/2014   USD      
4   3   Detroit     A11         B22         C33         6/5/2014    6/29/2014   USD      
5   4   Detroit     A11         B22         C33         6/29/2014   6/30/2014   USD      
6   5   Detroit     A11         B22         C33         6/30/2014   12/31/9999  USD      
7   7   INDIA       A10         B20         C30         5/15/2014   6/30/2014   USD      
8   6   INDIA       A10         B20         C30         5/15/2014   6/30/2014   USD      
9   8   INDIA       A10         B20         C30         6/30/2014   12/31/9999  USD      

尝试更新记录但没有成功

Update t_plant
FROM
    (
        SELECT t_plant_1.* 
        FROM  t_plant t_plant_1
            ,
            (
            SELECT plant_Name,PART1, PART2, PART3, mfg_date  
                  ,COALESCE(  MIN(mfg_date)
                        OVER(PARTITION BY  plant_Name,PART1, PART2, PART3  ORDER BY mfg_date
                                    ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING )
                                    ,CAST('9999-12-31'AS DATE)  ) AS effout_date --Lead_COALESCE
             FROM   t_plant
             GROUP BY  plant_Name,PART1, PART2, PART3, mfg_date      
             ) t_plant_2
        WHERE  t_plant_1.plant_Name = t_plant_2.plant_Name
        AND t_plant_1.PART1 = t_plant_2.PART1
        AND t_plant_1.PART2 = t_plant_2.PART2
        AND t_plant_1.PART3 = t_plant_2.PART3
        AND t_plant_1.mfg_date = t_plant_2.mfg_date
        ORDER BY   t_plant_1.plant_Name,t_plant_1.PART1 ,t_plant_1.PART2,t_plant_1.PART3,t_plant_1.mfg_date 
    ) B1
SET effout_date = B1.effout_date
WHERE  plant_Name = B1.plant_Name
AND PART1 = B1.PART1
AND PART2 = B1.PART2
AND PART3 = B1.PART3
AND mfg_date = B1.mfg_date;

输出需求是

part1       mfg_date    effout_date_old effout_date_New
A11         2/1/2014    12/31/9999  3/1/2014
A11         3/1/2014    12/31/9999  6/5/2014
A11         6/5/2014    12/31/9999  6/29/2014
A11         6/5/2014    12/31/9999  6/29/2014
A11         6/29/2014   12/31/9999  6/30/2014
A11         6/30/2014   12/31/9999  12/31/9999
A10         5/15/2014   12/31/9999  6/30/2014
A10         5/15/2014   12/31/9999  6/30/2014
A10         6/30/2014   12/31/9999  12/31/9999

【问题讨论】:

    标签: teradata


    【解决方案1】:

    您的最终选择很接近,您只需将选择部分替换为更新:

    update t_plant 
    from
    (
    SELECT plant_Name,PART1, PART2, PART3, mfg_date  
          ,COALESCE(  MIN(mfg_date)
                OVER(PARTITION BY  plant_Name,PART1, PART2, PART3  ORDER BY mfg_date
                            ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING )
                            ,CAST('9999-12-31'AS DATE)  ) AS effout_date --Lead_COALESCE
     FROM   t_plant
     GROUP BY  plant_Name,PART1, PART2, PART3, mfg_date      
     ) t_plant_2
    SET effout_date = t_plant_2.effout_date
    Where  t_plant.plant_Name = t_plant_2.plant_Name
    and t_plant.PART1 = t_plant_2.PART1
    and t_plant.PART2 = t_plant_2.PART2
    and t_plant.PART3 = t_plant_2.PART3
    and t_plant.mfg_date = t_plant_2.mfg_date
    

    【讨论】:

    • 如果你想为 t_plant 使用别名,你必须 update p from t_plant as p, (select....)
    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2018-07-15
    相关资源
    最近更新 更多