簡體   English   中英

SQL Server-ROW_NUMBER()->重新重置?

[英]SQL Server - ROW_NUMBER() -> Reset again?

我們正在編寫的查詢中遇到一個特定的問題。 這是示例:

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時,Row_number不會重置。 它我們收到的結果(沒有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()在“下一個”行中達到員工價值的峰值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM