Sql 要添加根据现有列计算的新列吗

Sql 要添加根据现有列计算的新列吗,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有一个插入了呼叫数据的表。现在我要计算通话的拾取时间和结束时间 Create table calldata ( calldate Datetime, picktime datetime, status varchar(50) ) insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:43:57 PM','ATTENDED') insert into calldata values

我有一个插入了呼叫数据的表。现在我要计算通话的拾取时间和结束时间

Create table calldata 
(
    calldate Datetime,
    picktime datetime,
    status varchar(50)
)

insert into calldata 
values('2016-11-18 04:43:37 PM','2016-11-18 04:43:57 PM','ATTENDED')

insert into calldata 
values('2016-11-18 04:43:37 PM','2016-11-18 04:44:25 PM','ESCALATED')

insert into calldata 
values('2016-11-18 04:43:37 PM','2016-11-18 04:49:52 PM','ESCALATED')

insert into calldata 
values('2016-11-18 04:43:37 PM','2016-11-18 04:50:20 PM','CLOSED')

select * from calldata
输出:

calldate                | picktime                 | status
--------------------------------------------------------------
2016-11-18 16:43:37.000 | 2016-11-18 16:43:57.000  | ATTENDED
2016-11-18 16:43:37.000 | 2016-11-18 16:44:25.000  | ESCALATED
2016-11-18 16:43:37.000 | 2016-11-18 16:49:52.000  | ESCALATED
2016-11-18 16:43:37.000 | 2016-11-18 16:50:20.000  | CLOSED
现在我想从上表中得到如下数据:

calldate                | picktime                 |   CloseTime                | status
-------------------------------------------------------------------------------------------
2016-11-18 16:43:37.000 | 2016-11-18 16:43:57.000  |   2016-11-18 16:44:25.000  | ATTENDED
2016-11-18 16:43:37.000 | 2016-11-18 16:44:25.000  |   2016-11-18 16:49:52.00   | ESCALATED
2016-11-18 16:43:37.000 | 2016-11-18 16:49:52.000  |   2016-11-18 16:50:20.00   | CLOSED
2016-11-18 16:43:37.000 | 2016-11-18 16:50:20.000  |                            | CLOSED
像这样的

LEAD(picktime, 1, null) OVER (PARTITION BY calldate ORDER BY picktime)?
它会为同一个calldate获取下一个PictTime。

类似的内容

LEAD(picktime, 1, null) OVER (PARTITION BY calldate ORDER BY picktime)?
Begin Tran

Create table calldata (calldate Datetime,picktime datetime,status varchar(50))

insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:43:57 PM','ATTENDED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:44:25 PM','ESCALATED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:49:52 PM','ESCALATED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:50:20 PM','CLOSED')


select calldate,picktime,LEAD(picktime,1) OVER (ORDER BY picktime )as CloseTime,status from calldata
RollBack Tran

它会为同一个calldate获取下一个PictTime。

使用子查询很容易:

Begin Tran

Create table calldata (calldate Datetime,picktime datetime,status varchar(50))

insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:43:57 PM','ATTENDED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:44:25 PM','ESCALATED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:49:52 PM','ESCALATED')
insert into calldata values('2016-11-18 04:43:37 PM','2016-11-18 04:50:20 PM','CLOSED')


select calldate,picktime,LEAD(picktime,1) OVER (ORDER BY picktime )as CloseTime,status from calldata
RollBack Tran
select *, 
    (
     select top 1 d.picktime from calldata d 
     where d.picktime > c.picktime
     order by d.picktime asc) previous_picktime
from calldata c
此qry与
LEAD
排名函数的作用相同(但我更喜欢使用subqry,因为在以前的版本(例如MSSQL 2008 R2)中不存在LEAD)


如果要添加列,最好将其添加到视图中。

使用子查询非常简单:

select *, 
    (
     select top 1 d.picktime from calldata d 
     where d.picktime > c.picktime
     order by d.picktime asc) previous_picktime
from calldata c
此qry与
LEAD
排名函数的作用相同(但我更喜欢使用subqry,因为在以前的版本(例如MSSQL 2008 R2)中不存在LEAD)


如果要添加列,最好将此列添加到视图中。

您确定要将关闭时间作为下一次呼叫的选取时间吗?不是下一次呼叫,而是要从一个特定移动设备进行同一次呼叫的关闭时间。此数据仅适用于一个否。我希望不同移动设备的关闭时间相同,我希望计算呼叫持续时间,即picktime closeTime是否确定要将关闭时间作为下一次呼叫的选取时间?不是下一次呼叫,而是要将同一个特定移动电话的关闭时间作为下一次呼叫的选取时间。此数据仅适用于一个号码。我希望不同移动电话的关闭时间相同,我希望计算呼叫持续时间,即picktime closetime