sql中用CTE实现增加row_number()列

本文介绍如何在SQL中为表增加新列并默认赋值,利用公共表表达式(CTE)来更新该列的值。通过ROW_NUMBER()函数结合GETDATE()函数为新增加的ID列填充唯一值。

增加一列:

ALTER table table1 add id int default 0

用CTE更新创建的这个id列:

with CTE as
(
select *,rn=ROW_NUMBER() OVER(ORDER BY getdate())
from table1
)
update CTE set id= rn

补充CTE的定义

指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在单条 SELECT、INSERT、UPDATE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。

以下ORACLE的SQL语句存在错误,请修改成正确的SQL,并保留原SQL的注释。SQL:WITH czzinfo AS( SELECT pwsr.WorkSegmentRequirement, to_char(pwsr.CREATED_ON, 'yyyy-MM-dd') "operatortime", u.NAME FROM PRODUCTIONWOMENTRESPONSE6635 pwsr LEFT JOIN PRODUCTIONOUTERIALACTUALCE23 poma ON poma.SOURCE_ID = pwsr.ID LEFT JOIN OUTPUTMATERIALACTUALSN omasn ON OMASN.SOURCE_ID = poma.ID LEFT JOIN "USER" u ON u.ID = pwsr.CREATED_BY_ID WHERE OMASN.RELATED_ID = 'mGgFHdeBLkvI8DmExEFgAA' ), jyzinfo AS( SELECT qitr.WorkSegmentRequirement, to_char(qitr.CREATED_ON, 'yyyy-MM-dd') "examinertime", u.NAME FROM QUALITYINSPECTIONTESTRECORD qitr LEFT JOIN "USER" u ON u.ID = qitr.CREATED_BY_ID WHERE qitr.SerialNumber = 'mGgFHdeBLkvI8DmExEFgAA' ) Select Distinct * from ( SELECT -- ROW_NUMBER() OVER (ORDER BY wsr.CODE) AS "serialnumber", wsr.CODE, WSR.NAME, CASE WHEN wsr.KeyProcesses = 1 THEN '☆本工序为关键工序' WHEN wsr.KeyProcesses != 1 AND WSR.NAME IN ('电测','PIND') THEN '通过' WHEN wsr.KeyProcesses != 1 AND WSR.NAME IN ='中转' THEN '转出人:'||u2.NAME ||' '||'接收人:'||u3.NAME ELSE wsr.Description END AS "recordrequirements", NVL(czzinfo.NAME, '') || '/' || NVL(czzinfo."operatortime", '') AS "operator", NVL(jyzinfo.NAME, '') || '/' || NVL(jyzinfo."examinertime", '') AS "examiner" FROM STANDARDPRODNWORKREQUEST5AFA spwr LEFT JOIN F_WORKSEGMENTREQUIREMENT wsr ON wsr.WorkRequest = SPWR.ID LEFT JOIN czzinfo ON czzinfo.WorkSegmentRequirement = wsr.ID LEFT JOIN jyzinfo ON jyzinfo.WorkSegmentRequirement = wsr.ID LEFT JOIN "USER" u2 ON wsr.StartWorkPerson=u2.PERSON LEFT JOIN "USER" u3 ON wsr.FINISHEDWORKPERSON=u3.PERSON WHERE spwr.ID = 'L6bAbr4Uw3OPhEWus3qFvw' ) src ORDER BY src.CODE ASC
08-23
如下SQL执行时报错D.POINT_TIME,[Error] Execution (18: 80): ORA-01843: not a valid month,请协助修改, 并优化oracle如下SQL性能,提高执行效率和减少资源占用: WITH work_s AS ( SELECT A.EMP_CODE, A.EMPNAME, A.WORK_DATE, B.WS_NUMBER, B.WS_SIMPLE_NAME, C.LAST_TIME_TOTAL, D.POINT_TIME, D.ADV_TIME, D.OVER_TIME, D.WP_TYPE, D.IS_NEXT_DAY, -- 统一时间计算逻辑 CASE WHEN D.WP_TYPE = 2 AND D.IS_NEXT_DAY = 1 THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||' '||to_char(D.POINT_TIME,'hh24:mi:ss')) + 1--INTERVAL '1' DAY ELSE TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||' '||to_char(D.POINT_TIME,'hh24:mi:ss')) END AS base_time, -- 优化OVERPOINT_TIME计算 TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||' '||to_char(D.POINT_TIME,'hh24:mi:ss')) + CASE WHEN D.WP_TYPE = 2 THEN (C.LAST_TIME_TOTAL + CASE WHEN B.WS_NUMBER IN ('035A','035B') THEN 90 WHEN B.WS_NUMBER = '005A' THEN 60 ELSE 120 END)/1440 ELSE 0 END + CASE WHEN D.IS_NEXT_DAY = 1 THEN 1 ELSE 0 END AS overpoint_time, -- 单独计算005A的特殊时间点 CASE WHEN B.WS_NUMBER = '005A' AND D.WP_TYPE = 2 THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||' '||to_char(D.POINT_TIME,'hh24:mi:ss')) + (C.LAST_TIME_TOTAL + 240)/1440 END AS overpoint_time2 FROM HCP.v_clk_tz_emp_workday_info A JOIN HCP.v_clk_work_shift B ON A.WS_ID = B.ID JOIN HCP.v_clk_work_block C ON A.WS_ID = C.WS_ID JOIN HCP.v_clk_work_point D ON C.ID = D.WB_ID WHERE A.WORK_DATE = TRUNC(SYSDATE-1) ), attendance_data AS ( SELECT DECODE(HPB.WORK_PLACE, 0, 'LSP1', 1, 'LSP2', 2, 'LSP3') AS MASTER_NO, DECODE(HPB.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园') AS WORK_PLACE, HPB.EMPCODE, HPB.EMPNAME, FF.FGT02, FF.FGT08, SUBSTR(FF.FGT08,3,1) AS card_type, HPB.RANK_NAME, HPB.ORG_NAME, DECODE(H.SALARY_TYPE,1,'月薪',2,'计时',3,'计件') AS SALARY_TYPE FROM FINGER5.FGT_FILE FF JOIN HCP.TZ_EMP_IN HPB ON FF.FGT10 = HPB.EMPCODE JOIN HCP.v_clk_tz_employee H ON FF.FGT10 = H.EMPCODE JOIN work_s A ON A.EMP_CODE = FF.FGT10 WHERE FF.FGT02 >= TRUNC(SYSDATE-1) AND FF.FGT02 < TRUNC(SYSDATE-1)+1 -- 优化日期范围 AND FF.FGT03 <> '4' AND LENGTH(FF.FGT08) = 5 AND SUBSTR(FF.FGT08,3,1) IN ('1','2') AND ( (SUBSTR(FF.FGT08,3,1) = '1' AND A.WP_TYPE = 1 AND FF.FGT02 BETWEEN A.base_time AND A.base_time + INTERVAL '1' MINUTE) OR (SUBSTR(FF.FGT08,3,1) = '2' AND A.WP_TYPE = 2 AND ( CASE WHEN (H.SALARY_TYPE = 1 AND FF.FGT02 BETWEEN A.base_time AND A.base_time + INTERVAL '1' MINUTE) THEN 1 --OR WHEN H.SALARY_TYPE <> 1 AND (A.WS_NUMBER = '005A' AND ( FF.FGT02 BETWEEN A.base_time AND A.base_time + INTERVAL '1' MINUTE OR FF.FGT02 BETWEEN A.overpoint_time AND A.overpoint_time + INTERVAL '1' MINUTE OR FF.FGT02 BETWEEN A.overpoint_time2 AND A.overpoint_time2 + INTERVAL '1' MINUTE)) THEN 1 --OR WHEN H.SALARY_TYPE <> 1 AND (FF.FGT02 BETWEEN A.base_time AND A.base_time + INTERVAL '1' MINUTE OR FF.FGT02 BETWEEN A.overpoint_time AND A.overpoint_time + INTERVAL '1' MINUTE) THEN 1 END )=1) ) ), attendance_filtered AS ( SELECT MASTER_NO, WORK_PLACE, EMPCODE, EMPNAME, FGT02, FGT08, card_type, DECODE(card_type, '1', '上班卡', '2', '下班卡') AS status, RANK_NAME, ORG_NAME, SALARY_TYPE, ROW_NUMBER() OVER ( PARTITION BY EMPCODE, card_type ORDER BY FGT02 ASC ) AS rank -- 按员工和打卡类型分区,取最早记录 FROM attendance_data ), tz_opr AS ( SELECT KLV.MEANING, KLV.DESCRIPTION, KLV.REVERSE2, KLV.REVERSE1, KLV.REVERSE3 IP, KLV.REVERSE4 FROM HCP.KS_LOOKUP_VALUE KLV WHERE KLV.LOOKUP_TYPE = 'KQ_SEPARATE_MACHINE' AND KLV.ENABLED = 'Y' ) SELECT MASTER_NO, WORK_PLACE AS MASTER_NAME, EMPCODE AS ID_NO_SZ, EMPNAME AS NAME_SZ, FGT02 AS RECORDTIME, FGT08 AS MACHINE_NO, trunc(SYSDATE-1) AS CDAY, -- 修改为TRUNC确保纯日期输出 A.REVERSE4 AS MACHINE_LOC, status AS SHIFTTYPE, RANK_NAME AS TITLE_NO, HCP.SF_LSHR_NO_GET(EMPCODE, 18) AS TITLE_NAME, SALARY_TYPE, HCP.SF_LSHR_NO_GET(EMPCODE, 2) AS SEGMENT_NO, HCP.SF_LSHR_NO_GET(EMPCODE, 13) AS SEGMENT_NAME, SUBSTR(HCP.SF_LSHR_NO_GET(EMPCODE, 15), LENGTH(HCP.SF_LSHR_NO_GET(EMPCODE, 15))-5) AS DEPT_NO, -- 取后6位 HCP.SF_LSHR_NO_GET(EMPCODE, 15) AS DEPT_NAME, HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 9), 8) AS TOEMAIL, HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 10), 8) || ';' || HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 11), 8) AS CCEMAIL, '' AS TEMP_COMPANY FROM attendance_filtered JOIN tz_opr A ON FGT08 = A.MEANING WHERE rank = 1 -- 取每个员工每个打卡类型的最早记录 ORDER BY status, FGT02; -- 按打卡类型和时间排序
08-02
WITH handle_data AS ( SELECT ocbi.biz_info_oid, ocfh.flow_handle_oid, ocfh.user_code, NVL(u.user_name, ocfh.user_code) AS operator_name, NVL(org.unit_name, '未知处室') AS dept_name, ocs.operation_date, -- ✅ 使用操作时间 CASE WHEN ocbi.item_code = '01' AND ocbi.sub_item = '01' THEN '普通来文' WHEN ocbi.item_code = '01' AND ocbi.sub_item = '02' THEN '会议件' WHEN ocbi.item_code = '02' THEN '发文' WHEN ocbi.item_code = '03' AND ocbi.sub_item = '03' THEN '内部文' END AS file_type, ocs.operation_code FROM oa_common_flow_handle ocfh INNER JOIN oa_common_flow_step_ins ocfs ON ocfh.step_ins_oid = ocfs.step_ins_oid INNER JOIN oa_common_biz_info ocbi ON ocbi.flow_ins_oid = ocfs.flow_ins_oid INNER JOIN oa_common_step_operation ocs ON ocfh.flow_handle_oid = ocs.flow_handle_oid LEFT JOIN users u ON ocfh.user_code = u.reference_oid LEFT JOIN oa_unit_org org ON ocfh.unit_oid = org.unit_oid WHERE ocs.operation_code IN ('04','08') -- 只统计办理/完成 AND TO_CHAR(ocs.operation_date,'YYYY') = '2025' -- ✅ 按操作时间过滤 AND ( (ocbi.item_code = '01' AND ocbi.sub_item IN ('01','02')) OR ocbi.item_code = '02' OR (ocbi.item_code = '03' AND ocbi.sub_item = '03') ) ), offtime_handle AS ( SELECT * FROM ( SELECT hd.biz_info_oid, hd.flow_handle_oid, hd.user_code, hd.operator_name, hd.dept_name, hd.file_type, hd.operation_date, TO_CHAR(hd.operation_date,'MM') AS month_id, ROW_NUMBER() OVER ( PARTITION BY hd.flow_handle_oid, hd.user_code ORDER BY hd.operation_date ) AS rn FROM handle_data hd WHERE WEEKDAY(hd.operation_date) IN (0,6) -- 周末 OR ( WEEKDAY(hd.operation_date) BETWEEN 1 AND 5 AND (TO_NUMBER(TO_CHAR(hd.operation_date,'HH24MI')) < 900 OR TO_NUMBER(TO_CHAR(hd.operation_date,'HH24MI')) >= 1800) ) ) WHERE rn = 1 ) SELECT ofh.dept_name AS 处室, ofh.operator_name AS 处理人, ofh.file_type AS 文类, SUM(CASE WHEN month_id='01' THEN 1 ELSE 0 END) AS 一月, SUM(CASE WHEN month_id='02' THEN 1 ELSE 0 END) AS 二月, SUM(CASE WHEN month_id='03' THEN 1 ELSE 0 END) AS 三月, SUM(CASE WHEN month_id='04' THEN 1 ELSE 0 END) AS 四月, SUM(CASE WHEN month_id='05' THEN 1 ELSE 0 END) AS 五月, SUM(CASE WHEN month_id='06' THEN 1 ELSE 0 END) AS 六月, SUM(CASE WHEN month_id='07' THEN 1 ELSE 0 END) AS 七月, SUM(CASE WHEN month_id='08' THEN 1 ELSE 0 END) AS 八月, SUM(CASE WHEN month_id='09' THEN 1 ELSE 0 END) AS 九月, SUM(CASE WHEN month_id='10' THEN 1 ELSE 0 END) AS 十月, SUM(CASE WHEN month_id='11' THEN 1 ELSE 0 END) AS 十一月, SUM(CASE WHEN month_id='12' THEN 1 ELSE 0 END) AS 十二月, COUNT(DISTINCT ofh.flow_handle_oid || '-' || ofh.user_code) AS 年度合计 FROM offtime_handle ofh GROUP BY ofh.dept_name, ofh.operator_name, ofh.file_type ORDER BY ofh.dept_name, ofh.operator_name, ofh.file_type; 我要统计拟稿人在非工作时间的拟稿数量
最新发布
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值