Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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 Server-行号()->是否再次重置?_Sql_Sql Server_Window Functions - Fatal编程技术网

SQL Server-行号()->是否再次重置?

SQL Server-行号()->是否再次重置?,sql,sql-server,window-functions,Sql,Sql Server,Window Functions,我们在当前编写的查询中面临一个特定的问题。 以下是一个例子: Doc. ID | Timestamp | Employee 01 | 01 | A 01 | 02 | B 01 | 03 | B 01 | 04 | C 01 | 05 | A 01 | 06 | A

我们在当前编写的查询中面临一个特定的问题。 以下是一个例子:

Doc. ID | Timestamp | Employee 
 01     | 01        | A        
 01     | 02        | B        
 01     | 03        | B        
 01     | 04        | C        
 01     | 05        | A        
 01     | 06        | A       
我们希望实现的是:

Doc. ID | Timestamp | Employee 
 01     | 01        | A        
 01     | 03        | B        
 01     | 04        | C        
 01     | 06        | A      
这是我们的方法,但不起作用:

SELECT [Doc. ID], [Timestamp], [Employee]
       ,ROW_NUMBER() OVER (PARTITION BY [Doc. ID],[Employee] order by [Employee] desc) as "RN"
FROM XY
WHERE "RN" = 1
但不幸的是,这不起作用,因为在底部再次找到A时,行号不会重置。如果没有where条款,我们收到的结果是:

 Doc. ID | Timestamp | Employee | RN
  01     | 01        | A        | 1
  01     | 02        | B        | 1
  01     | 03        | B        | 2
  01     | 04        | C        | 1
  01     | 05        | A        | 2
  01     | 06        | A        | 3
我认为实现正确的解决方案只需要多一点

在下一行的员工价值中使用lead to peak:

select xy.*
from (select xy.*,
             lead(employee) over (partition by docid order by timestamp) as next_employee
      from xy
     ) xy
where next_employee is null or next_employee <> employee;

我想你想要:

SELECT [doc. ID], MAX([Timestamp]) AS [Timestamp], employee
FROM (SELECT t.*,
             row_number() over (order by [Timestamp]) as seq1,
             row_number() over (partition by [doc. ID], employee order by [Timestamp]) as seq2
      FROM XY t
     ) t
GROUP BY [doc. ID], employee, (seq1 - seq2)
ORDER BY [Timestamp]; 

谢谢,成功了!我们也考虑了一些超前/滞后的问题,但不知何故,我们找不到合适的解决方案-@阿肯。您更喜欢具有两个窗口函数和聚合的更复杂的解决方案?我可以补充一点,在这一次之后大约10分钟。