- Ключ-кандидат для этой таблицы
(track_id, "order")
; waypoint_id
не нужно включать.
- (вы можете добавить дополнительное уникальное ограничение на
(track_id, waypoint_id)
, чтобы запретить посещение точек дважды на одной дорожке)
- ограничение gapless не требуется, вам нужен только порядок и (для каждой дорожки) уникальность для
order
ORDER
- ключевое слово; лучше избегать его в качестве идентификатора.
CREATE TABLE tracks
(track_id INTEGER NOT NULL
, step INTEGER NOT NULL
, waypoint_id INTEGER -- REFERENCES waypoints(id)
, PRIMARY KEY (track_id,step)
);
INSERT INTO tracks(track_id, step, waypoint_id)VALUES
(1,1,89) , (1,2,16) , (1,4,17), (1,5,19), (1,6,4) -- mind the gap!
, (2,11,75) , (2,22,28) , (2,44,2) -- Large gaps!
;
CREATE VIEW tracks_ordered AS
SELECT track_id
, rank() OVER (PARTITION BY track_id ORDER BY step) AS "Order!"
, waypoint_id
FROM tracks;
SELECT *FROM tracks_ordered;
Результат:
track_id | Order! | waypoint_id
----------+--------+-------------
1 | 1 | 89
1 | 2 | 16
1 | 3 | 17
1 | 4 | 19
1 | 5 | 4
2 | 1 | 75
2 | 2 | 28
2 | 3 | 2
(8 rows)