SQL Server - ROW_NUMBER () -> Сбросить еще раз? - PullRequest
0 голосов
/ 20 марта 2019

мы столкнулись с конкретной проблемой в запросе, который пишем в данный момент. Вот пример:

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

Но, к сожалению, это не работает, потому что 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

Я думаю, что это только немного больше, чтобы найти правильное решение ..:)

Ответы [ 2 ]

4 голосов
/ 20 марта 2019

Используйте 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;
2 голосов
/ 20 марта 2019

Я думаю, что вы хотите агрегации:

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