将列更新为从 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;
我有的是这个:
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;