Sql 满足两个标准时的日期差异
我试图定义一张票在特定任务中停留了多长时间。我有专栏。我的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
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]分割)按日期戳排序)从#几乎到#之后的日期数据按[编号]排序,分配#组,日期戳