I have table with observations of objects moving along edges in a graph, this table has the following form:
PK | TIMESTAMP | object_id | from_id | to_id
where object_id
is the id of some object and from_id
and to_id
are vertices.
Since the movements are observed at a high frequency the tuple
(object_id, from_id, to_id)
is repeated often for different PK
and TIMESTAMPS
. I'm interested in all the separate edge traversals, so if an object with id 1 moves from vertex 1 to 2, from 2 to 1 and from 1 to 2 I want to have a result:
object_id | from_id | to_id
1 | 1 | 2
1 | 2 | 1
1 | 1 | 2
My question: how to write this query?
Best Answer
The tuples would have to be ordered by
from_id, to_id
in such a way that whenfrom_id
orto_id
changes, it would fall under a different grouping. I was thinking of writing this as a Stored Procedure, but I thought of something much more intriguing (I just got the idea from my answering this question Update ranking on table about 3 hours ago)I'll do it in stages
Stage 1 : Sample Data
Stage 2 : Sample Data Loaded
Stage 3 : Create Query with Running Counters That Changes When Tuple Changes (call it the Tuple Change Query)
Stage 4 : Run the Tuple Change Query
Please notice that
@inc
changes only when the tuple changes !!!Stage 5 : Put Tuple Change Query in a Subquery, extract Needed Data From Tuple Change Query, Run GROUP BY group_number (call it Duplicate Extraction Query)
Stage 6 : Run Duplicate Extraction Query
Stage 7 : (OPTIONAL) Show Count for Each group_number
Stage 8 : (OPTIONAL) Run the Show Count Query for Each group_number
Stage 9 : Give it a Try !!!