sql - 顺序不同

标签 sql sql-server t-sql

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

示例:

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,但我计划使用更新的版本。

最佳答案

您可以使用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)

关于sql - 顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942033/

相关文章:

mysql - sql server中合并行的问题

sql-server - 将 SQL NVARCHAR(MAX) 转换为 XML 并从 XML 字符串中获取值

c# - 从自引用表中获取所有子项(子项、孙项)和父项

sql - 使用sql server添加特定日期、年、月、周

sql server数据透视表查询

sql - 如何在更新父记录时插入一组子记录?

c# - 在 NHibernate 映射层中使用复杂的 where 子句

sql - 如何检查WITH语句是否为空

java - Hibernate - 在 OneToMany 上使用 JOIN 时 sqlQuery 映射冗余记录

sql - SAS 中合并的工作(使用 IN=)