按 Acct # 排序,然后根据指定的文本删除,然后为每个 Acct # 代码减去时间变量

Sort by Acct # then delete based on specified text then subtract time variable for each Acct # Code attached

我需要计算某人完成一个帐户所需的时间。首先,数据需要按 "ID" 从小到大排序,然后按 "ACT_UPDATED oldest to newest (like an excel sort) However, I need to delete data where someone begins " 编辑开始”但不进行更改,因此 "Editing End" 直接位于 "Editing Begin" 下方。

ID         ACT_NOTE     UPDATED_BY     ACT_UPDATED
1651    Editing End    Name1      May-18-2015 13:05:07
46485   Editing End    Name4      May-15-2015 16:38:35
111213  Comment        Name3            May-19-2015 15:34:09
111213  Editing End        Name3      May-19-2015 15:34:16
111213  Editing Begin      Name3      May-19-2015 15:34:33
111213  Comment            Name3      May-19-2015 15:35:00
111213  Editing End    Name3      May-19-2015 15:35:00
556456  Editing Begin      Name2      May-18-2015 12:05:53
556456  Editing End    Name2      May-18-2015 12:06:00

简而言之,我希望将数据对齐为:

    ID  ACT_NOTE    UPDATED_BY  ACT_UPDATED
111213  Editing Begin   Name3       5/19/2015  3:34:33 PM
111213  Comment     Name3       5/19/2015  3:35:00 PM
111213  Editing End Name3       5/19/2015  3:35:00 PM

唯一保留的数据应具有以下顺序(编辑开始--评论--编辑结束)。有时 Comment 和 Editing End 的时间是一样的。

我尝试使用此代码,但它不正确:

SELECT IIF(OR(ACCT_NOTE=1,'Editing Begin',””,'Editing End')(ACT_UPDATED from ID

where ACT_NOTE !='Editing Begin' and ACT_NOTE !='Editing End';  

可以看到ID 111213有两个"Editing End"可以删除。

然后最后一步是从帐户 111213 的 "Editing End" 中减去时间 (ACT_UPDATED) "Editing Begin" 以获得花费在编辑上的总时间。感谢您的宝贵时间!

Select a.*,
f.*

from(select ACT_ID
    ,ACT_REF_ID
    ,ACT_TYPE
    ,ACT_USER_TYPE
    ,ACT_NOTE
    ,ACT_UPDATED_BY
    ,ACT_UPDATED_DT
 from PRISMMGR.ARA_ACTIVITIES)a

 left join

 (select ACCT_ID
    ,ACCT_NO
    ,ACCT_SSN
    ,ACCT_ID_LOB
    ,ACCT_POP_SEGMENT
    ,ACCT_SECTION
    ,ACCT_LOB_SYS_ID
    ,ACCT_CREATED_DT
    from PRISMMGR.ARA_ACCOUNTS)f

   on a.ACT_REF_ID = f.ACCT_ID

  where ACT_TYPE != 'ADD' and ACT_TYPE != 'DELETE' and ACT_TYPE != 'USER ENTRY' and ACT_UPDATED_DT > '14/MAY/2015'

你可以得到你想要的顺序:

select ID, ACT_NOTE, UPDATE_BY, ACCT_UPDATED, ns.sortOrder
from myTable t
left join NoteSort ns on t.ACT_NOTE = ns.note
order by t.ID, t.ACCT_UPDATED, ns.sortOrder;

假设你做了一个 table 这样的:

create table NoteSort
( note nvarchar(100) primary key, sortOrder int ) ; 
insert into NoteSort values ( 'Editing Begin', 1 );
insert into NoteSort values (  'Comment', 2 ); 
insert into NoteSort values ( 'Editing End', 3 ); 

但这并没有解决确保所有三个 'activities'(开始、评论、结束)的困难部分。为此,您只需 select Comments 并加入自身即可找到 Begin 和 End 活动。像这样:

;with x as ( 
  -- make a derived table with the sort order of activities
  select ID, ACT_NOTE, UPDATE_BY, ACCT_UPDATED, ns.noteOrder,
    row_number() over ( partition by ID order by acct_Updated, ns.noteOrder ) 
      as activityNum
  from myTable t
  left join NoteSort ns on t.ACT_NOTE = ns.note
) 
select x.id, x.act_note, x.update_by, x.acct_updated, 
     completeActvities.EditingTime   
from x
inner join (   
  -- join the three activities together, which will filter out any 
  -- that don't occur one after the other
  select x_comment.id
       , x_begin.activityNum as begin_ActivityNum
       , x_comment.activityNum as comment_ActivityNum
       , x_end.activityNum as end_ActivityNum
       , cast( ( x_end.acct_updated - x_begin.acct_updated ) as time ) as EditingTime
  from x x_comment
  inner join x x_begin on x_comment.id = x_begin.id 
                      and x_begin.activityNum = x_comment.activityNum-1
                      and x_begin.noteOrder = 1
  inner join x x_end on x_comment.id = x_end.id
                      and x_end.activityNum = x_comment.activityNum+1
                      and x_end.noteOrder =3
  where x_comment.NoteOrder = 2
) as completeActvities 
    -- join back to the main list, filtering for only 
    -- the activities with the complete set 
     on x.id = completeActvities.id
     and x.activityNum in ( completeActvities.begin_activityNum,   completeActvities.comment_activityNum, completeActvities.end_activityNum )
order by id, activityNum 

SQLFiddle