嗨,我想将列更新为从 01-01-21 到 15-01-21 的更新,依此类推,每 15 天后它将从 dbms 范围更改

问题描述

嗨,请帮助我将此更新列重新定义为从 01-01-21 到 15-01-21 的更新,依此类推,每 15 天后它将从 dbms 更改为我所拥有的内容

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 天后它会改变任何帮助

解决方法

样本数据的设置:

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,则每 15 天就会更改一次 prate。请注意,由于查询使用的是 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;