https://gist.github.com/wishdev/635f7a839877d79a6781

Sorry for the 3rd party site - just easier to get the layout correct.....

A CTE and dense_rank is all it takes. I am always amazed at what one can
now pack into such small amounts of code.


On Wed, Jul 23, 2014 at 4:00 PM, Jim Garrison <jim.garri...@nwea.org> wrote:

> I have a collection of relationship rows of the form
>
> Table: graph
>     key1 varchar
>     key2 varchar
>
> A row of the form ('a','b') indicates that 'a' and 'b' are related.
> The table contains many relationships between keys, forming several
> disjoint sets. All relationships are bi-directional, and both
> directions are present.  I.e. the table contains a set of disjoint
> graphs specified as node pairs.
>
> For example the set of values
>
>     key1    key2
>     -----   -----
>       a       x
>       a       y
>       b       w
>       c       t
>       x       a
>       y       a
>       y       z
>       z       y
>       t       c
>       w       b
>       w       d
>       d       w
>
> defines three disjoint groups of connected keys:
>
>       a x y z
>       c t
>       b w d
>
> What I would like to achieve is a single SQL query that returns
>
>       group key
>       ----- ---
>         1    a
>         1    x
>         1    y
>         1    z
>         2    c
>         2    t
>         3    b
>         3    w
>         3    d
>
> I don't care about preserving the node-to-node relationships, only
> the group membership for each node.
>
> I've been playing with "WITH RECURSIVE" CTEs but haven't had any
> success.  I'm not really sure how to express what I want in SQL, and
> it's not completely clear to me that recursive CTEs will help here.
> Also I'm not sure how to generate the sequence numbers for the groups
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

Reply via email to