pgr_withPointsKSP - Proposed

pgr_withPointsKSP — Yen’s algorithm for K shortest paths using Dijkstra.

Warning

Proposed functions for next mayor release.

  • They are not officially in the current release.

  • They will likely officially be part of the next mayor release:

    • The functions make use of ANY-INTEGER and ANY-NUMERICAL

    • Name might not change. (But still can)

    • Signature might not change. (But still can)

    • Functionality might not change. (But still can)

    • pgTap tests have being done. But might need more.

    • Documentation might need refinement.

_images/boost-inside.jpeg

Boost Graph Inside

Availability

Version 3.6.0

  • Standarizing output columns to (seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)

  • pgr_withPointsKSP (One to One)

    • Signature change: driving_side parameter changed from named optional to unnamed compulsory driving side.

    • Added start_vid and end_vid result columns.

  • New overload functions

    • pgr_withPointsKSP (One to Many)

    • pgr_withPointsKSP (Many to One)

    • pgr_withPointsKSP (Many to Many)

    • pgr_withPointsKSP (Combinations)

  • Deprecated signature

    • pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,char,boolean)

Version 2.2.0

  • New proposed function

Description

Modifies the graph to include the points defined in the Points SQL and using Yen algorithm, finds the \(K\) shortest paths.

Signatures

pgr_withPointsKSP(Edges SQL, Points SQL, start vid, end vid, K, driving_side, [options])
pgr_withPointsKSP(Edges SQL, Points SQL, start vid, end vids, K, driving_side, [options])
pgr_withPointsKSP(Edges SQL, Points SQL, start vids, end vid, K, driving_side, [options])
pgr_withPointsKSP(Edges SQL, Points SQL, start vids, end vids, K, driving_side, [options])
pgr_withPointsKSP(Edges SQL, Points SQL, Combinations SQL, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, node, edge, cost, agg_cost)
OR EMPTY SET

One to One

pgr_withPointsKSP(Edges SQL, Points SQL, start vid, end vid, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
OR EMTPY SET
Example:

Get 2 paths from Point \(1\) to point \(2\) on a directed graph with left side driving.

  • For a directed graph.

  • No details are given about distance of other points of the query.

  • No heap paths are returned.

SELECT * FROM pgr_withPointsKSP(
    'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, -2, 2, 'l');
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -2 |   -1 |    1 |  0.6 |        0
   2 |       1 |        2 |        -1 |      -2 |    6 |    4 |    1 |      0.6
   3 |       1 |        3 |        -1 |      -2 |    7 |    8 |    1 |      1.6
   4 |       1 |        4 |        -1 |      -2 |   11 |   11 |    1 |      2.6
   5 |       1 |        5 |        -1 |      -2 |   12 |   13 |    1 |      3.6
   6 |       1 |        6 |        -1 |      -2 |   17 |   15 |  0.6 |      4.6
   7 |       1 |        7 |        -1 |      -2 |   -2 |   -1 |    0 |      5.2
   8 |       2 |        1 |        -1 |      -2 |   -1 |    1 |  0.6 |        0
   9 |       2 |        2 |        -1 |      -2 |    6 |    4 |    1 |      0.6
  10 |       2 |        3 |        -1 |      -2 |    7 |    8 |    1 |      1.6
  11 |       2 |        4 |        -1 |      -2 |   11 |    9 |    1 |      2.6
  12 |       2 |        5 |        -1 |      -2 |   16 |   15 |  1.6 |      3.6
  13 |       2 |        6 |        -1 |      -2 |   -2 |   -1 |    0 |      5.2
(13 rows)

One to Many

pgr_withPointsKSP(Edges SQL, Points SQL, start vid, end vids, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, node, edge, cost, agg_cost)
OR EMTPY SET
Example:

Get 2 paths from point \(1\) to point \(3\) and vertex \(7\) on an undirected graph

SELECT * FROM pgr_withPointsKSP(
  'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
  'SELECT pid, edge_id, fraction, side from pointsOfInterest',
  -1, ARRAY[-3, 7], 2, 'B',
  directed => false);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -3 |   -1 |    1 |  0.6 |        0
   2 |       1 |        2 |        -1 |      -3 |    6 |    4 |    1 |      0.6
   3 |       1 |        3 |        -1 |      -3 |    7 |   10 |    1 |      1.6
   4 |       1 |        4 |        -1 |      -3 |    8 |   12 |  0.6 |      2.6
   5 |       1 |        5 |        -1 |      -3 |   -3 |   -1 |    0 |      3.2
   6 |       2 |        1 |        -1 |      -3 |   -1 |    1 |  0.6 |        0
   7 |       2 |        2 |        -1 |      -3 |    6 |    4 |    1 |      0.6
   8 |       2 |        3 |        -1 |      -3 |    7 |    8 |    1 |      1.6
   9 |       2 |        4 |        -1 |      -3 |   11 |   11 |    1 |      2.6
  10 |       2 |        5 |        -1 |      -3 |   12 |   12 |  0.4 |      3.6
  11 |       2 |        6 |        -1 |      -3 |   -3 |   -1 |    0 |        4
  12 |       3 |        1 |        -1 |       7 |   -1 |    1 |  0.6 |        0
  13 |       3 |        2 |        -1 |       7 |    6 |    4 |    1 |      0.6
  14 |       3 |        3 |        -1 |       7 |    7 |   -1 |    0 |      1.6
  15 |       4 |        1 |        -1 |       7 |   -1 |    1 |  0.6 |        0
  16 |       4 |        2 |        -1 |       7 |    6 |    2 |    1 |      0.6
  17 |       4 |        3 |        -1 |       7 |   10 |    5 |    1 |      1.6
  18 |       4 |        4 |        -1 |       7 |   11 |    8 |    1 |      2.6
  19 |       4 |        5 |        -1 |       7 |    7 |   -1 |    0 |      3.6
(19 rows)

Many to One

pgr_withPointsKSP(Edges SQL, Points SQL, start vids, end vid, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, node, edge, cost, agg_cost)
OR EMTPY SET
Example:

Get a path from point \(1\) and vertex \(6\) to point \(3\) on a directed graph with right side driving and details set to True

SELECT * FROM pgr_withPointsKSP(
  'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
  'SELECT pid, edge_id, fraction, side from pointsOfInterest',
  ARRAY[-1, 6], -3, 1, 'r', details=> true);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -3 |   -1 |    1 |  0.4 |        0
   2 |       1 |        2 |        -1 |      -3 |    5 |    1 |    1 |      0.4
   3 |       1 |        3 |        -1 |      -3 |    6 |    4 |  0.7 |      1.4
   4 |       1 |        4 |        -1 |      -3 |   -6 |    4 |  0.3 |      2.1
   5 |       1 |        5 |        -1 |      -3 |    7 |   10 |    1 |      2.4
   6 |       1 |        6 |        -1 |      -3 |    8 |   12 |  0.6 |      3.4
   7 |       1 |        7 |        -1 |      -3 |   -3 |   -1 |    0 |        4
   8 |       2 |        1 |         6 |      -3 |    6 |    4 |  0.7 |        0
   9 |       2 |        2 |         6 |      -3 |   -6 |    4 |  0.3 |      0.7
  10 |       2 |        3 |         6 |      -3 |    7 |   10 |    1 |        1
  11 |       2 |        4 |         6 |      -3 |    8 |   12 |  0.6 |        2
  12 |       2 |        5 |         6 |      -3 |   -3 |   -1 |    0 |      2.6
(12 rows)

Many to Many

pgr_withPointsKSP(Edges SQL, Points SQL, start vids, end vids, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
OR EMTPY SET
Example:

Get a path from point \(1\) and vertex \(6\) to point \(3\) and vertex \(1\) on a directed graph with left side driving and heap_paths set to True

SELECT * FROM pgr_withPointsKSP(
  'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
  'SELECT pid, edge_id, fraction, side from pointsOfInterest',
  ARRAY[-1, 6], ARRAY[-3, 1], 1, 'l', heap_paths => true);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -3 |   -1 |    1 |  0.6 |        0
   2 |       1 |        2 |        -1 |      -3 |    6 |    4 |    1 |      0.6
   3 |       1 |        3 |        -1 |      -3 |    7 |   10 |    1 |      1.6
   4 |       1 |        4 |        -1 |      -3 |    8 |   12 |  0.6 |      2.6
   5 |       1 |        5 |        -1 |      -3 |   -3 |   -1 |    0 |      3.2
   6 |       2 |        1 |        -1 |       1 |   -1 |    1 |  0.6 |        0
   7 |       2 |        2 |        -1 |       1 |    6 |    4 |    1 |      0.6
   8 |       2 |        3 |        -1 |       1 |    7 |    7 |    1 |      1.6
   9 |       2 |        4 |        -1 |       1 |    3 |    6 |    1 |      2.6
  10 |       2 |        5 |        -1 |       1 |    1 |   -1 |    0 |      3.6
  11 |       3 |        1 |         6 |      -3 |    6 |    4 |    1 |        0
  12 |       3 |        2 |         6 |      -3 |    7 |   10 |    1 |        1
  13 |       3 |        3 |         6 |      -3 |    8 |   12 |  0.6 |        2
  14 |       3 |        4 |         6 |      -3 |   -3 |   -1 |    0 |      2.6
  15 |       4 |        1 |         6 |       1 |    6 |    4 |    1 |        0
  16 |       4 |        2 |         6 |       1 |    7 |    7 |    1 |        1
  17 |       4 |        3 |         6 |       1 |    3 |    6 |    1 |        2
  18 |       4 |        4 |         6 |       1 |    1 |   -1 |    0 |        3
(18 rows)

Combinations

pgr_withPointsKSP(Edges SQL, Points SQL, Combinations SQL, K, driving_side, [options])
options: [directed, heap_paths, details]
Returns set of (seq, path_id, path_seq, node, edge, cost, agg_cost)
OR EMTPY SET
Example:

Using a combinations table on an directed graph

SELECT * FROM pgr_withPointsKSP(
  'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
  'SELECT pid, edge_id, fraction, side from pointsOfInterest',
  'SELECT * FROM (VALUES (-1, 10), (6, -3)) AS combinations(source, target)',
  2, 'r', details => true);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      10 |   -1 |    1 |  0.4 |        0
   2 |       1 |        2 |        -1 |      10 |    5 |    1 |    1 |      0.4
   3 |       1 |        3 |        -1 |      10 |    6 |    4 |  0.7 |      1.4
   4 |       1 |        4 |        -1 |      10 |   -6 |    4 |  0.3 |      2.1
   5 |       1 |        5 |        -1 |      10 |    7 |    8 |    1 |      2.4
   6 |       1 |        6 |        -1 |      10 |   11 |    9 |    1 |      3.4
   7 |       1 |        7 |        -1 |      10 |   16 |   16 |    1 |      4.4
   8 |       1 |        8 |        -1 |      10 |   15 |    3 |    1 |      5.4
   9 |       1 |        9 |        -1 |      10 |   10 |   -1 |    0 |      6.4
  10 |       2 |        1 |        -1 |      10 |   -1 |    1 |  0.4 |        0
  11 |       2 |        2 |        -1 |      10 |    5 |    1 |    1 |      0.4
  12 |       2 |        3 |        -1 |      10 |    6 |    4 |  0.7 |      1.4
  13 |       2 |        4 |        -1 |      10 |   -6 |    4 |  0.3 |      2.1
  14 |       2 |        5 |        -1 |      10 |    7 |    8 |    1 |      2.4
  15 |       2 |        6 |        -1 |      10 |   11 |   11 |    1 |      3.4
  16 |       2 |        7 |        -1 |      10 |   12 |   13 |    1 |      4.4
  17 |       2 |        8 |        -1 |      10 |   17 |   15 |    1 |      5.4
  18 |       2 |        9 |        -1 |      10 |   16 |   16 |    1 |      6.4
  19 |       2 |       10 |        -1 |      10 |   15 |    3 |    1 |      7.4
  20 |       2 |       11 |        -1 |      10 |   10 |   -1 |    0 |      8.4
  21 |       3 |        1 |         6 |      -3 |    6 |    4 |  0.7 |        0
  22 |       3 |        2 |         6 |      -3 |   -6 |    4 |  0.3 |      0.7
  23 |       3 |        3 |         6 |      -3 |    7 |   10 |    1 |        1
  24 |       3 |        4 |         6 |      -3 |    8 |   12 |  0.6 |        2
  25 |       3 |        5 |         6 |      -3 |   -3 |   -1 |    0 |      2.6
(25 rows)

Parameters

Column

Type

Description

Edges SQL

TEXT

Edges SQL query as described.

Points SQL

TEXT

Points SQL query as described.

start vid

ANY-INTEGER

Identifier of the departure vertex.

  • Negative values represent a point

end vid

ANY-INTEGER

Identifier of the destination vertex.

  • Negative values represent a point

K

ANY-INTEGER

Number of required paths

driving_side

CHAR

Value in [r, R, l, L, b, B] indicating if the driving side is:

  • [r, R] for right driving side (for directed graph only)

  • [l, L] for left driving side (for directed graph only)

  • [b, B] for both (only for undirected graph)

Where:

ANY-INTEGER:

SMALLINT, INTEGER, BIGINT

Optional parameters

Column

Type

Default

Description

directed

BOOLEAN

true

  • When true the graph is considered Directed

  • When false the graph is considered as Undirected.

KSP Optional parameters

Column

Type

Default

Description

heap_paths

BOOLEAN

false

  • When false Returns at most K paths.

  • When true all the calculated paths while processing are returned.

  • Roughly, when the shortest path has N edges, the heap will contain about than N * K paths for small value of K and K > 5.

withPointsKSP optional parameters

Parameter

Type

Default

Description

details

BOOLEAN

false

  • When true the results will include the points that are in the path.

  • When false the results will not include the points that are in the path.

Inner Queries

Edges SQL

Column

Type

Default

Description

id

ANY-INTEGER

Identifier of the edge.

source

ANY-INTEGER

Identifier of the first end point vertex of the edge.

target

ANY-INTEGER

Identifier of the second end point vertex of the edge.

cost

ANY-NUMERICAL

Weight of the edge (source, target)

reverse_cost

ANY-NUMERICAL

-1

Weight of the edge (target, source)

  • When negative: edge (target, source) does not exist, therefore it’s not part of the graph.

Where:

ANY-INTEGER:

SMALLINT, INTEGER, BIGINT

ANY-NUMERICAL:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Points SQL

Parameter

Type

Default

Description

pid

ANY-INTEGER

value

Identifier of the point.

  • Use with positive value, as internally will be converted to negative value

  • If column is present, it can not be NULL.

  • If column is not present, a sequential negative value will be given automatically.

edge_id

ANY-INTEGER

Identifier of the “closest” edge to the point.

fraction

ANY-NUMERICAL

Value in <0,1> that indicates the relative postition from the first end point of the edge.

side

CHAR

b

Value in [b, r, l, NULL] indicating if the point is:

  • In the right r,

  • In the left l,

  • In both sides b, NULL

Where:

ANY-INTEGER:

SMALLINT, INTEGER, BIGINT

ANY-NUMERICAL:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Combinations SQL

Parameter

Type

Description

source

ANY-INTEGER

Identifier of the departure vertex.

target

ANY-INTEGER

Identifier of the arrival vertex.

Where:

ANY-INTEGER:

SMALLINT, INTEGER, BIGINT

Result columns

Returns set of (seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)

Column

Type

Description

seq

INTEGER

Sequential value starting from 1.

path_id

INTEGER

Path identifier.

  • Has value 1 for the first of a path from start_vid to end_vid

path_seq

INTEGER

Relative position in the path. Has value 1 for the beginning of a path.

node

BIGINT

Identifier of the node in the path from start_vid to end_vid

edge

BIGINT

Identifier of the edge used to go from node to the next node in the path sequence. -1 for the last node of the path.

cost

FLOAT

Cost to traverse from node using edge to the next node in the path sequence.

  • \(0\) for the last node of the path.

agg_cost

FLOAT

Aggregate cost from start vid to node.

Additional Examples

Use pgr_findCloseEdges in the Points SQL.

Get \(2\) paths using left side driving topology, from vertex \(1\) to the closest location on the graph of point (2.9, 1.8).

SELECT * FROM pgr_withPointsKSP(
  $e$ SELECT * FROM edges $e$,
  $p$ SELECT edge_id, round(fraction::numeric, 2) AS fraction, side
      FROM pgr_findCloseEdges(
        $$SELECT id, geom FROM edges$$,
        (SELECT ST_POINT(2.9, 1.8)),
        0.5, cap => 2)
  $p$,
  1, -1, 2,'r');
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |         1 |      -1 |    1 |    6 |    1 |        0
   2 |       1 |        2 |         1 |      -1 |    3 |    7 |    1 |        1
   3 |       1 |        3 |         1 |      -1 |    7 |    8 |    1 |        2
   4 |       1 |        4 |         1 |      -1 |   11 |    9 |    1 |        3
   5 |       1 |        5 |         1 |      -1 |   16 |   16 |    1 |        4
   6 |       1 |        6 |         1 |      -1 |   15 |    3 |    1 |        5
   7 |       1 |        7 |         1 |      -1 |   10 |    5 |  0.8 |        6
   8 |       1 |        8 |         1 |      -1 |   -1 |   -1 |    0 |      6.8
   9 |       2 |        1 |         1 |      -1 |    1 |    6 |    1 |        0
  10 |       2 |        2 |         1 |      -1 |    3 |    7 |    1 |        1
  11 |       2 |        3 |         1 |      -1 |    7 |   10 |    1 |        2
  12 |       2 |        4 |         1 |      -1 |    8 |   12 |    1 |        3
  13 |       2 |        5 |         1 |      -1 |   12 |   13 |    1 |        4
  14 |       2 |        6 |         1 |      -1 |   17 |   15 |    1 |        5
  15 |       2 |        7 |         1 |      -1 |   16 |   16 |    1 |        6
  16 |       2 |        8 |         1 |      -1 |   15 |    3 |    1 |        7
  17 |       2 |        9 |         1 |      -1 |   10 |    5 |  0.8 |        8
  18 |       2 |       10 |         1 |      -1 |   -1 |   -1 |    0 |      8.8
(18 rows)

  • Point \(-1\) corresponds to the closest edge from point (2.9, 1.8).

Left driving side

Get \(2\) paths using left side driving topology, from point \(1\) to point \(3\) with details.

SELECT * FROM pgr_withPointsKSP(
    'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, -3, 2, 'l', details => true);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -3 |   -1 |    1 |  0.6 |        0
   2 |       1 |        2 |        -1 |      -3 |    6 |    4 |  0.7 |      0.6
   3 |       1 |        3 |        -1 |      -3 |   -6 |    4 |  0.3 |      1.3
   4 |       1 |        4 |        -1 |      -3 |    7 |   10 |    1 |      1.6
   5 |       1 |        5 |        -1 |      -3 |    8 |   12 |  0.6 |      2.6
   6 |       1 |        6 |        -1 |      -3 |   -3 |   -1 |    0 |      3.2
(6 rows)

Right driving side

Get \(2\) paths using right side driving topology from, point \(1\) to point \(2\) with heap paths and details.

SELECT * FROM pgr_withPointsKSP(
    'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, -2, 2, 'r',
    heap_paths => true, details => true);
 seq | path_id | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
-----+---------+----------+-----------+---------+------+------+------+----------
   1 |       1 |        1 |        -1 |      -2 |   -1 |    1 |  0.4 |        0
   2 |       1 |        2 |        -1 |      -2 |    5 |    1 |    1 |      0.4
   3 |       1 |        3 |        -1 |      -2 |    6 |    4 |  0.7 |      1.4
   4 |       1 |        4 |        -1 |      -2 |   -6 |    4 |  0.3 |      2.1
   5 |       1 |        5 |        -1 |      -2 |    7 |    8 |    1 |      2.4
   6 |       1 |        6 |        -1 |      -2 |   11 |    9 |    1 |      3.4
   7 |       1 |        7 |        -1 |      -2 |   16 |   15 |  0.4 |      4.4
   8 |       1 |        8 |        -1 |      -2 |   -2 |   -1 |    0 |      4.8
   9 |       2 |        1 |        -1 |      -2 |   -1 |    1 |  0.4 |        0
  10 |       2 |        2 |        -1 |      -2 |    5 |    1 |    1 |      0.4
  11 |       2 |        3 |        -1 |      -2 |    6 |    4 |  0.7 |      1.4
  12 |       2 |        4 |        -1 |      -2 |   -6 |    4 |  0.3 |      2.1
  13 |       2 |        5 |        -1 |      -2 |    7 |    8 |    1 |      2.4
  14 |       2 |        6 |        -1 |      -2 |   11 |   11 |    1 |      3.4
  15 |       2 |        7 |        -1 |      -2 |   12 |   13 |    1 |      4.4
  16 |       2 |        8 |        -1 |      -2 |   17 |   15 |    1 |      5.4
  17 |       2 |        9 |        -1 |      -2 |   16 |   15 |  0.4 |      6.4
  18 |       2 |       10 |        -1 |      -2 |   -2 |   -1 |    0 |      6.8
  19 |       3 |        1 |        -1 |      -2 |   -1 |    1 |  0.4 |        0
  20 |       3 |        2 |        -1 |      -2 |    5 |    1 |    1 |      0.4
  21 |       3 |        3 |        -1 |      -2 |    6 |    4 |  0.7 |      1.4
  22 |       3 |        4 |        -1 |      -2 |   -6 |    4 |  0.3 |      2.1
  23 |       3 |        5 |        -1 |      -2 |    7 |   10 |    1 |      2.4
  24 |       3 |        6 |        -1 |      -2 |    8 |   12 |  0.6 |      3.4
  25 |       3 |        7 |        -1 |      -2 |   -3 |   12 |  0.4 |        4
  26 |       3 |        8 |        -1 |      -2 |   12 |   13 |    1 |      4.4
  27 |       3 |        9 |        -1 |      -2 |   17 |   15 |    1 |      5.4
  28 |       3 |       10 |        -1 |      -2 |   16 |   15 |  0.4 |      6.4
  29 |       3 |       11 |        -1 |      -2 |   -2 |   -1 |    0 |      6.8
(29 rows)

The queries use the Sample Data network.

See Also

Indices and tables