Eu tenho uma tabela com observações de objetos se movendo ao longo de arestas em um grafo, esta tabela tem a seguinte forma:
PK | TIMESTAMP | object_id | from_id | to_id
onde object_id
é o id de algum objeto e from_id
e to_id
são vértices.
Como os movimentos são observados em alta frequência, a tupla
(object_id, from_id, to_id)
é repetido frequentemente para diferentes PK
e TIMESTAMPS
. Estou interessado em todas as travessias de borda separadas, portanto, se um objeto com id 1 se mover do vértice 1 para 2, de 2 para 1 e de 1 para 2, quero ter um resultado:
object_id | from_id | to_id
1 | 1 | 2
1 | 2 | 1
1 | 1 | 2
Minha pergunta: como escrever esta consulta?
As tuplas teriam que ser ordenadas por
from_id, to_id
de tal forma que, quandofrom_id
outo_id
mudasse, cairia em um agrupamento diferente. Eu estava pensando em escrever isso como um procedimento armazenado, mas pensei em algo muito mais intrigante (só tive a ideia ao responder a esta pergunta Atualizar classificação na tabela cerca de 3 horas atrás)vou fazer em etapas
Estágio 1: dados de amostra
Estágio 2: dados de amostra carregados
Estágio 3: Criar consulta com contadores em execução que mudam quando a tupla é alterada (chame-a de consulta de alteração de tupla)
Etapa 4: execute a consulta de alteração de tupla
Observe que
@inc
muda apenas quando a tupla muda !!!Estágio 5: Coloque a consulta de alteração de tupla em uma subconsulta, extraia os dados necessários da consulta de alteração de tupla, execute GROUP BY group_number (chame-a de consulta de extração duplicada)
Etapa 6: executar consulta de extração duplicada
Estágio 7: (OPCIONAL) Mostrar contagem para cada group_number
Estágio 8: (OPCIONAL) Execute a consulta Mostrar contagem para cada group_number
Etapa 9: Experimente!!!