SQL-如何比较不同行中的两列?

SQL-如何比较不同行中的两列?,sql,sql-server,Sql,Sql Server,这是我的第一个问题 如何比较不同行中的两列?数据库是SQL Server 2000 我的表格中有这些数据: id entrance exit ----------- ----------------------- ----------------------- 10000 2017-06-03 09:07:00.000 NULL 10000 NULL 2017-06-03 11:59:0

这是我的第一个问题

如何比较不同行中的两列?数据库是SQL Server 2000

我的表格中有这些数据:

id          entrance                exit
----------- ----------------------- -----------------------
10000       2017-06-03 09:07:00.000 NULL
10000       NULL                    2017-06-03 11:59:00.000 
10000       NULL                    2017-06-03 12:31:00.000 
10000       2017-06-03 12:25:00.000 NULL
20000       2017-06-03 13:13:00.000 NULL
20000       NULL                    2017-06-03 17:39:00.000 
我需要核实入口和出口之间的差异

例如:第一个入口一线和第一个出口二线之间的差异,在此比较之后,验证第一个出口二线和下一个入口三线之间的差异,依此类推


我如何比较这些线?谢谢

每行包含入口或出口是真的吗?如果是的话,我的建议是将这些列合并为一列,并使用一个标志。你可以考虑使用UNION来达到这个目的


现在,您可以编写一个小程序,从第一行运行到最后一行,并查找连续行之间的差异。

每行是否包含入口或出口?如果是的话,我的建议是将这些列合并为一列,并使用一个标志。你可以考虑使用UNION来达到这个目的


现在,您可以编写一个小程序,从第一行运行到最后一行,并查找连续行之间的差异。

您需要按照精确的顺序生成行id

CREATE TABLE #temp
(RowId INT IDENTITY(1,1)
, Id   INT
, Entrance   DATETIME
, [Exit] DATETIME
)
INSERT #temp VALUES(10000 , '2017-06-03 09:07:00.000', NULL)
INSERT #temp VALUES(10000 , NULL, '2017-06-03 11:59:00.000' )
INSERT #temp VALUES(10000 , NULL ,'2017-06-03 12:31:00.000' )
INSERT #temp VALUES(10000 , '2017-06-03 12:25:00.000', NULL)
INSERT #temp VALUES(20000 , '2017-06-03 13:13:00.000', NULL)
INSERT #temp VALUES(20000 , NULL ,'2017-06-03 17:39:00.000')

SELECT  a.RowId
    , a.id
    , ISNULL(a.entrance, a.[exit]) AS Entrance
    , ISNULL(b.[exit], b.Entrance) AS [Exit]
FROM #temp a
LEFT JOIN #temp b 
    ON b.Id = a.Id
    AND b.RowId = a.RowId + 1

您需要按照精确的顺序创建行id

CREATE TABLE #temp
(RowId INT IDENTITY(1,1)
, Id   INT
, Entrance   DATETIME
, [Exit] DATETIME
)
INSERT #temp VALUES(10000 , '2017-06-03 09:07:00.000', NULL)
INSERT #temp VALUES(10000 , NULL, '2017-06-03 11:59:00.000' )
INSERT #temp VALUES(10000 , NULL ,'2017-06-03 12:31:00.000' )
INSERT #temp VALUES(10000 , '2017-06-03 12:25:00.000', NULL)
INSERT #temp VALUES(20000 , '2017-06-03 13:13:00.000', NULL)
INSERT #temp VALUES(20000 , NULL ,'2017-06-03 17:39:00.000')

SELECT  a.RowId
    , a.id
    , ISNULL(a.entrance, a.[exit]) AS Entrance
    , ISNULL(b.[exit], b.Entrance) AS [Exit]
FROM #temp a
LEFT JOIN #temp b 
    ON b.Id = a.Id
    AND b.RowId = a.RowId + 1

如果可能,您可以在id已存在时执行更新查询。此处的id不是唯一可识别的

然后您可以选择:

select t.exit - t.entrance as difference from table t where t.id="2000" 

如果仍然需要每次插入一个新行,那么按照Wendy在另一个回答中的建议,在SQL期间生成一个行id

如果可能,您可以在id已存在时执行更新查询。此处的id不是唯一可识别的

然后您可以选择:

select t.exit - t.entrance as difference from table t where t.id="2000" 

如果仍然需要每次插入一个新行,那么按照Wendy在另一个回答中的建议,在SQL期间生成一个行id

我建议使用以下代码。其思想是选择具有非空入口值en的所有行,然后将其与具有相同id但出口时间戳大于入口时间戳ex的记录联接。最后,使用left join xex确保在en和ex之间没有其他具有出口时间戳的行


我建议使用以下代码。其思想是选择具有非空入口值en的所有行,然后将其与具有相同id但出口时间戳大于入口时间戳ex的记录联接。最后,使用left join xex确保在en和ex之间没有其他具有出口时间戳的行



抱歉,我没有告诉您,数据库是SQL 2000。请停止您正在执行的所有操作,并升级到受支持的版本。只是一些建议。这是生命终止保障在4年前就结束了数据库里没有一行。除非您指定要订购的内容,否则数据将被视为无序。您是否有可靠的排序列(如上次更新)或标识列?@scsimon我认识man,但我不能这样做@LordPeter所有数据都是由IDSorry排序的,我没有告诉您,数据库是SQL 2000。停止您正在做的一切,升级到受支持的版本。只是一些建议。这是生命终止保障在4年前就结束了数据库里没有一行。除非您指定要订购的内容,否则数据将被视为无序。你有可靠的订购栏吗?例如最近更新的,或者身份栏?@scsimon我认识人,但我不能这样做@LordPeter所有数据都是由IDI订购的。在原始数据中,我有入口和出口。我有一个标志来描述入口“E”和出口“S”。我认为最好是写一个过程。我认为最好是写一个过程。首先根据Id、datetime、最新列进行排序。从第一行循环到最后一行。如果有不同类型的“E”或“S”,则从顶部的行中减去当前行的日期时间。您可以生成一个包含id、日期、时差的数组。这是另一个疑问,如何最好地循环数据?光标还是其他方式?我更喜欢创建此作业的光标。在原始数据中,我将入口和出口放在一起。我有一个标志来描述入口“E”和出口“S”。我认为最好是写一个过程。我认为最好是写一个过程。首先根据Id、datetime、最新列进行排序。从第一行循环到最后一行。如果有不同类型的“E”或“S”,则从顶部的行中减去当前行的日期时间。您可以生成一个包含id、日期、时差的数组。这是另一个疑问,如何最好地循环数据?光标还是其他方式?我更喜欢创建此作业的光标。