问题描述
嗨,请帮助我将此更新列重新定义为从 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;