Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 满足两个标准时的日期差异_Sql_Sql Server_Datediff_Sql Server 2016 - Fatal编程技术网

Sql 满足两个标准时的日期差异

Sql 满足两个标准时的日期差异,sql,sql-server,datediff,sql-server-2016,Sql,Sql Server,Datediff,Sql Server 2016,我试图定义一张票在特定任务中停留了多长时间。我有专栏。我的SQL如下所示 select [number], datestamp, assignment_group, [sequence] from #ranking1 order by [number],[sequence] 我相信有一个简单的方法可以做到这一点,虽然我不太确定它是什么了。我的数据当前看起来像: ticket no Datestamp taskNo ranking IM123456 3/24/2016 13

我试图定义一张票在特定任务中停留了多长时间。我有专栏。我的SQL如下所示

select 
[number],
datestamp, 
assignment_group,
[sequence]
from #ranking1
order by [number],[sequence] 
我相信有一个简单的方法可以做到这一点,虽然我不太确定它是什么了。我的数据当前看起来像:

ticket no   Datestamp   taskNo  ranking
IM123456    3/24/2016 13:44 task1   1
IM123456    3/24/2016 17:01 task2   2
IM123456    4/20/2016 11:57 task3   3
IM123456    5/26/2016 10:50 task3   4
IM123456    7/29/2016 15:39 task1   5
IM123456    8/2/2016 13:15  task2   6
IM123456    10/25/2016 15:42task1   7
IM123456    10/26/2016 16:27task2   8
IM321654    4/5/2016 11:53  task4   1
IM321654    4/8/2016 16:06  task1   2
IM321654    4/11/2016 13:33 task6   3
IM321654    5/12/2016 15:58 task1   4
我希望我的最终结果是

Number  Task    Number_days
IM123456    task1   4
IM123456    task2   111
IM123456    task3   100
IM123456    task1   3
IM123456    task4   0
IM123456    task6   31

我希望我能有点道理。我正在使用SQL studio 2016

您可以使用
LAG
查看以前的记录。因此,当您查看一条
[number]
和任务(
assignment\u group
)并按
日期戳对其记录进行排序时,您需要每隔一条记录,并从其自身的
日期戳中减去以前的
日期戳

select
  [number],
  assignment_group,
  datediff(day, datebefore, datestamp) as number_days
from
(
  select 
    [number],
    datestamp, 
    assignment_group,
    row_number() over (partition by [number], assignment_group order by datestamp) as rn,
    lag(datestamp) over (partition by [number], assignment_group order by datestamp)
      as datebefore
  from #ranking1
) data
where rn % 2 = 0
order by [number], datestamp;
或者使用
rn%2=1
LEAD
获取下一个
日期戳。然后,您还将显示有开始记录但还没有结束记录的数字


此处尝试:此处尝试:。

根据您的样本数据,您的最终结果是否正确?例如,IM123456,task1,为什么最终结果的天数为4天?在2016年3月24日至2016年10月25日之间,我应该收到215份。这是下一个日期之间的差异,而不是每个数字的最大日期。也就是说,这是我在Task1中花费的总时间,我得到了不同的数字。例如:IM123456/task1:有三个条目:
2016-03-24
2016-07-29
,和
2016-10-25
。因此,任务于
2016-03-24
开始,并于
2016-07-29
=127天结束。然后于2016年10月25日重新开始,至今尚未关闭。还是我误解了这个概念?@sophieDeslongchamps,如果你能解释为什么IM123456/task1有4天(基于你当前的样本数据),我认为它可以工作,但它给我的天数似乎没有增加。我有编号邮戳任务\集团序列IM1234 3/24/2016任务1 IM1234 3/24/2016任务2 IM1234 4/20/2016任务3 IM1234 5/26/2016任务3 IM1234 7/29/2016任务1 5 IM1234 8/2/2016任务2 6 IM1234 10/25/2016任务1 7 IM1234 10/26/2016任务2 8我应该拥有的是IM1234任务1 111 IM1234任务2 5 IM1234任务2 5 IM1234任务3 100Oops,你是对的,我错过了分区中的
作业组
。请检查我更新的查询。现在它几乎可以工作了,它显示了我的数据表中的一个缺陷,我必须返回并修复。也就是说,我修改了一些语句,它工作得非常完美!谢谢你的耐心。ps rextester非常擅长帮助我找出我不确定的线条。很抱歉,该格式在本论坛的评论中似乎找不到该格式。我最后使用的代码(见下一条注释)是选择[number],分配组,datediff(day,datestamp,dateafter)作为从(选择[number],datestamp,分配组,dense_rank()到(按[number]分割,按[number]顺序,按[number],日期戳)作为rn,lead(日期戳)到(按[number]分割)按日期戳排序)从#几乎到#之后的日期数据按[编号]排序,分配#组,日期戳