【问题标题】:Update column as update from 01-01-21 to 15-01-21 and so on as on after each 15 days it will change from dbms range将列更新为从 01-01-21 更新到 15-01-21 等等,每 15 天后它将从 dbms 范围更改
【发布时间】:2021-06-09 11:06:50
【问题描述】:

我拥有的是这样的:

VI_ID   DP_DATE EMPLOYEE_ID QTY   PRATE

    1/1/2020    10000001    33          
    1/2/2020    10000001    30          
    1/3/2020    10000001    31          
    1/4/2020    10000001    34          
    1/5/2020    10000001    30          
    1/6/2020    10000001    30          
    1/7/2020    10000001    33          
    1/8/2020    10000001    31          

我想要的是这个:

VI_ID   DP_DATE         EMPLOYEE_ID QTY   PRATE

    1/1/2020    10000001    33            30
    1/2/2020    10000001    30            30
    1/3/2020    10000001    31            30
    1/4/2020    10000001    34            30
    1/5/2020    10000001    30            32
    1/6/2020    10000001    30            32 
    1/7/2020    10000001    33            32 
    1/8/2020    10000001    31            32

就像这里一样,它会在 4 天后发生变化。我可以在这段代码中添加什么来满足我的愿望?

update DAILY_PRODUCTION
set PRATE = floor(dbms_random.value(30, 35))

在这个列表中,还有很多其他员工,dbms 也会给每个员工随机编号,并且在 15 天内所有日期都相同,15 天后它会改变。

【问题讨论】:

    标签: oracle plsql oracle11g oracle-sqldeveloper plsqldeveloper


    【解决方案1】:

    样本数据的设置:

    CREATE TABLE daily_production
    AS
            SELECT DATE '2021-1-1' + LEVEL - 1            AS dp_date,
                   10000001                               AS employee_id,
                   FLOOR (DBMS_RANDOM.VALUE (30, 35))     AS qty,
                   CAST (NULL AS NUMBER)                  AS prate
              FROM DUAL
        CONNECT BY LEVEL <= 60;
    

    然后通过使用MERGE 语句,您可以按照您的描述更新数据。下面的示例将每 4 天更改一次 prate。如果将 3 个MOD 语句从 4 修改为 15,则 prate 将每 15 天更改一次。请注意,由于查询使用ROWNUM,因此仅当日期内没有间隔时才有效。如果您只希望更改影响特定日期范围,还可以修改内部选择上的 WHERE 子句。

    MERGE INTO daily_production dp
         USING (SELECT dp_date,
                       CASE
                           WHEN MOD (ROWNUM - 1, 4) > 0
                           THEN
                               LAG (prate, MOD (ROWNUM - 1, 4)) OVER (ORDER BY dp_date)
                           ELSE
                               prate
                       END    AS prate
                  FROM (  SELECT dp_date,
                                 CASE
                                     WHEN MOD (ROWNUM, 4) = 1 THEN FLOOR (DBMS_RANDOM.VALUE (30, 35))
                                 END    AS prate
                            FROM daily_production
                           WHERE dp_date >= DATE '2021-1-1' AND dp_date <= DATE '2021-1-20'
                        ORDER BY dp_date)) d
            ON (dp.dp_date = d.dp_date)
    WHEN MATCHED
    THEN
        UPDATE SET dp.prate = d.prate;
    

    【讨论】:

    • 哦,男孩,你解决了我的问题,我现在不在系统上,检查后我会告诉你,感谢你的宝贵时间和工作最诚挚的问候
    • 它适用于 [dbfiddle.uk/… 我只检查了一个问题是否适用于此表中的所有 Employee_ID 谢谢
    • 是的,不管employee_id是什么,整个表每4行就会改变一次
    • 一束感谢亲爱的@EJ Egyed
    • 嗨@EJ Egyed 它给我这个错误ORA-30926: unable to get a stable set of rows in the source tables 好的,我们可以通过'distinct'得到它,但我也需要所有重复的行相同,因为它的每日生产表和每个日期都有是否有很多员工将设置生产,所以在一个日期有很多记录或许多员工 ID,我必须更新所有相同类型的日期,并且每个员工的日期都不相同,员工 ID 相同 15 天谢谢提前请帮帮我为此其紧迫
    猜你喜欢
    • 1970-01-01
    • 2015-03-02
    • 2018-12-14
    • 2019-02-26
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多