顺序不同

时间:2015-03-09 12:28:59

标签: 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       1
12:00       2
14:00       1
15:00       5
17:00       1

有没有办法用sql或tsql做到这一点?我目前正在使用2008 R2,但我打算使用更新的版本。

2 个答案:

答案 0 :(得分:3)

您可以使用LAG(从SQL Server 2012开始提供)获取上一条记录的计算机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)

请注意,您还需要谓词PrevMachine IS NULL,因为第一条记录没有先前的记录。

SQL Fiddle Demo here

对于SQL Server 2008,上述查询可以写为:

;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)

答案 1 :(得分:0)

select * from tablebname t1
where t1.machine <> (select top 1 machine from tablename t2
                     where t2.time < t1.time
                     order by t2.time desc)

如果行&#34;之前&#34;时间相同的机器,不要返回这一行。