Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Tsql - Fatal编程技术网

Sql 顺序不同

Sql 顺序不同,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含时间和整数值的表,用于存储基于时间的机器使用情况 例如: Time / machine 11:00 1 12:00 2 13:00 2 14:00 1 15:00 5 16:00 5 17:00 1 要查找机器更改,我必须筛选连续且包含相同机器id的行。现在,我通过选择所有行并在while循环中搜索机器更改来完成此操作 我等待的是 Time / machine 11:00

我有一个包含时间和整数值的表,用于存储基于时间的机器使用情况

例如:

Time    /   machine
11:00       1
12:00       2
13:00       2
14:00       1
15:00       5
16:00       5
17:00       1
要查找机器更改,我必须筛选连续且包含相同机器id的行。现在,我通过选择所有行并在while循环中搜索机器更改来完成此操作

我等待的是

Time    /   machine
11:00       1
12:00       2
14:00       1
15:00       5
17:00       1
有没有一种方法可以用sql或tsql来实现?我目前正在使用2008 R2,但我计划使用更新的版本

select * from tablebname t1
where t1.machine <> (select top 1 machine from tablename t2
                     where t2.time < t1.time
                     order by t2.time desc)
如果time wise之前的行具有相同的计算机,则不要返回此行。

您可以使用SQL Server 2012以后的LAG来获取上一条记录的计算机id。然后,您可以在外部查询中将当前记录的id与上一条记录的id进行比较:

SELECT [Time], Machine
FROM (
   SELECT [Time], Machine, LAG(Machine) OVER (ORDER BY [Time]) AS PrevMachine
   FROM MachineTable ) m
WHERE (PrevMachine IS NULL) OR (machine <> PrevMachine)

第一排或第一台机器始终处于正常状态。我明白了,当未找到子查询行时为NULL。。。稍后将进行编辑。我将接受您的答案,但我有一个问题;演出怎么样?使用此解决方案或使用返回临时表的表值函数哪个更好。@sddk在这种情况下,最好在实际数据上尝试这两种解决方案,看看哪个查询执行得更好。我的猜测是,与使用相关子查询的查询相比,我的查询的性能更好,尤其是在源表中有大量记录的情况下。这是Lag+1的一个非常好的用法。
;WITH CTE AS (
SELECT [Time], Machine, ROW_NUMBER() OVER (ORDER BY [Time]) AS rn
FROM MachineTable
)
SELECT c1.[Time], c1.machine 
FROM CTE AS c1
LEFT JOIN CTE AS c2 ON c1.rn = c2.rn + 1
WHERE (c2.machine IS NULL) OR (c1.machine <> c2.machine)