Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
如何在MS SQL Server中减去两个连续行?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

如何在MS SQL Server中减去两个连续行?

如何在MS SQL Server中减去两个连续行?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,一张桌子看起来像: id | location | datetime ------| ---------| -------- CD123 | loc001 | 2010-10-21 13:30:15 ZY123 | loc001 | 2010-10-21 13:40:15 YU333 | loc001 | 2010-10-21 13:41:00 AB456 | loc002 | 2011-1-21 14:30:30 FG121 | loc002 | 2011-1-21

一张桌子看起来像:

id    | location | datetime
------| ---------| --------
CD123 | loc001   | 2010-10-21 13:30:15
ZY123 | loc001   | 2010-10-21 13:40:15
YU333 | loc001   | 2010-10-21 13:41:00
AB456 | loc002   | 2011-1-21 14:30:30
FG121 | loc002   | 2011-1-21 14:31:00
BN010 | loc002   | 2011-1-21 14:32:00
假设表已按升序日期时间排序。我试图在一个位置内找到两个连续行之间的时间间隔(以秒为单位)

结果表应为:

| location | elapse 
| loc001   | 600  
| loc001   | 45
| loc002   | 30
| loc002   | 60
由于
id
是随机生成的,因此很难在查询中编写类似
a.id=b.id+1
的内容。并且只有同一位置内的行被连续减去,而不是跨不同位置


我应该如何在MS SQL Server中编写查询来完成它?

在SQL Server 2012及更高版本中,您可以使用
LEAD
LAG

SELECT 
   location,
   SUM(DATEDIFF(SECOND, DateTime, 
                Lead(DateTime, 1) OVER(PARTITION BY location ORDER BY DateTime))) Elepase 
FROM 
    tableName  
GROUP BY 
    location
您有两个选择:

添加一个新的,然后在ID上自行加入,例如[new ID]=[new ID]-1。然后可以进行减法,即表1.[新ID]-表2.[新ID]


使用,这是上述方法的快捷方式。只要您使用SQL2012+

创建
cte
并使用
lead
在同一行获取日期时间和下一个日期时间。
with Result as 
(Select *, ROW_NUMBER() Over (order by location,datetime) RowID from table_name  )
Select R1.location,DATEDIFF(SECOND,R2.datetime,R1.datetime)   from Result R1     Inner join Result R2 on (R1.RowID=R2.RowID+1 and R1.location=r2.location)
然后使用此cte使用
datediff
进行计算

WITH cte
    AS
    (
        SELECT location
        ,      datetime
        ,      lead(datetime,1) OVER (patition BY location ORDER BY datetime asc) next_datetime
        from tbl)
    SELECT location
    ,      datediff(ss,next_datetime,datetime) Elepase 
    FROM cte
您可以这样尝试:

  select s.location,
         s.datetime,
         datediff(ss, s.datetime, s.prev_datetime)
    from (
           select location, 
                  datetime,
                  lead(datetime) over (partition by location order by datetime ) prev_datetime
             from Table1 
         ) s
   where s.prev_datetime is not null
order by s.location, 
         s.datetime desc

添加一个“新id”,其行号按日期时间排序。有了它,你就可以完成你想要的“a.id=b.id+1”。当你完成一个
OVER(按位置按日期时间顺序划分)时,你就不能进行
groupbylocation
更不用说
分组依据
只能在每个位置获得1行,这不是OP要求的。感谢
领先
滞后
功能的指导。我发现一个关于两个函数()的教程非常有用。我在回答中没有
sum
groupby
,就得到了想要的结果。正如@ughai所说,我不理解
sum
groupby
的用法。你能给我一个简短的解释吗?谢谢。介意一点吗?避免只回答代码。提供一些关于如何工作的说明。您应该基于
位置
进行分区,而不是
日期时间