将列更新为从 01-01-21 更新到 15-01-21 等等,每 15 天后它将从 dbms 范围更改

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

我有的是这个:

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 天更改一次。请注意,这仅在自查询使用 ROWNUM 以来日期内没有间隔的情况下才有效。如果您只希望更改影响特定日期范围,您还可以修改内部 select 上的 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;