Em um relatório atual, estou tentando rastrear a migração de uma pessoa do departamento n, para n+1 ou para n+k.
Meus dados são divididos em uma linha por período (dados universitários). Um exemplo:
dept | term
------------
a | 20120
a | 20121
a | 20122
b | 20123 -- <- person moved to new department
b | 20130
c | 20131 -- <- person moved to another new department
a | 20132 -- <- person went back to a department they've already been in
usando a consulta
select
dept,
FIRST_VALUE(term) OVER (PARTITION BY dept ORDER BY term) as
from
table
order by term;
dá-me:
dept | term
------------
a | 20120
a | 20120
a | 20120
b | 20123
b | 20123
c | 20131
a | 20120 -- <- notice this is the same as the above set of a's
Os a's duplicados no primeiro grupo e os b's no segundo grupo são devidos a outras linhas nos dados (estou bem com isso, mas remover isso seria um bônus). Meu principal problema é que preciso que o a final seja tratado como um grupo diferente; basicamente mostrando o primeiro cada vez que um cluster aparece.
Esse tipo de problema pode ser resolvido com o uso da
LAG()
função:Teste em: SQL-Fiddle
Acho que você precisará usar algum loop para fazer isso, pois precisa definir um grupo de registros quando o departamento mudar. Eu escrevi isso em TSQL, então você pode precisar fazer algumas alterações de sintaxe, mas funciona.