问题:从提出需求到需求通过,中间会经历不确定次数的“驳回->撤销驳回”的操作,所有的操作时间都位于同一列。求:需求从提出到通过经历的时间(不包含“驳回-撤销驳回”所消耗的时间)
PS: “驳回->撤销驳回”操作成对出现;且按时间顺序排列。
1. 建表
IF OBJECT_ID(‘tempdb..#logs‘,‘U‘)is NOT NULL DROP TABLE #logs IF OBJECT_ID(‘tempdb..#logs2‘,‘U‘)is NOT NULL DROP TABLE #logs2 IF OBJECT_ID(‘tempdb..#logs3‘,‘U‘)is NOT NULL DROP TABLE #logs3 CREATE TABLE #logs( ODate DATETIME ,Operation VARCHAR(20) ,ID INT ); INSERT INTO #logs VALUES(‘2018-08-09 09:00:00‘,‘提交需求‘,1); INSERT INTO #logs VALUES(‘2018-08-09 10:00:00‘,‘驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 11:30:00‘,‘撤销驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 12:00:00‘,‘驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 13:10:00‘,‘撤销驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 13:50:00‘,‘驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 19:00:00‘,‘撤销驳回‘,1); INSERT INTO #logs VALUES(‘2018-08-09 22:00:00‘,‘通过‘,1); INSERT INTO #logs VALUES(‘2018-08-10 09:00:00‘,‘提交需求‘,2); INSERT INTO #logs VALUES(‘2018-08-10 10:00:00‘,‘驳回‘,2); INSERT INTO #logs VALUES(‘2018-08-11 11:30:00‘,‘撤销驳回‘,2); INSERT INTO #logs VALUES(‘2018-08-11 12:00:00‘,‘驳回‘,2); INSERT INTO #logs VALUES(‘2018-08-11 13:00:00‘,‘撤销驳回‘,2); INSERT INTO #logs VALUES(‘2018-08-11 22:00:00‘,‘通过‘,2);
结果如图:
2. 按ID分组,对时间进行排序编号
--对时间进行排序并编号 SELECT ID,ODate,Operation,ROW_NUMBER() OVER (PARTITION BY id ORDER BY ODate)RowNum INTO #logs2 FROM #logs
结果如图:
3. 将下一操作执行时间追加到本行末尾
--新增列:下一步操作的时间 SELECT ID,Operation,ODate AS ADate , ( SELECT ODate FROM #logs2 WHERE rownum=t.rownum+1 and ID=t.id )AS BDate INTO #logs3 FROM #logs2 t
结果如图:
4. 计算结果
--计算需求提出到通过耗时(剔除驳回到撤销驳回耗时) SELECT ID,SUM(DATEDIFF(MI,ADate,Bdate)) CostTime FROM #logs3 WHERE Operation<>‘驳回‘ GROUP BY ID
原文地址:https://www.cnblogs.com/dunr/p/9452555.html
时间: 2024-11-05 22:05:25