Re: Complex query

From: Leonardo M(dot) Ramé <l(dot)rame(at)griensu(dot)com>
To: David Johnston <polobo(at)yahoo(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Complex query
Date: 2014-03-31 19:08:22
Message-ID: 20140331190822.GC10833@leonardo-laptop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 2014-03-31 11:46:28 -0700, David Johnston wrote:
> Leonardo M. Ramé-2 wrote
> > Hi, I'm looking for help with this query.
> >
> > Table Tasks:
> >
> > IdTask StatusCode StatusName
> > ----------------------------------
> > 1 R Registered
> > 1 S Started
> > 1 D Dictated
> > 1 F Finished
> > 1 T Transcribed
> > ----------------------------------
> > 2 R Registered
> > 2 S Started
> > 2 T Transcribed
> > 2 F Finished
> >
> > As you can see, I have a table containing tasks and statuses. What I
> > would like to get is the list of tasks, including all of its steps, for
> > only those tasks where the StatusCode sequence was S followed by T.
> >
> > In this example, the query should only return task Nº 2:
> >
> > 2 R Registered
> > 2 S Started
> > 2 T Transcribed
> > 2 F Finished
> >
> > Can anybody help me with this?.
>
> First you need to decide how tell the database that R-S-T-F is ordered and
> then maybe you can use window functions, specifically "lag(col, -1) over
> (...)", to determine what the prior row's code is and act accordingly.
>
> Put that into a sub-query and return the "IdTask" to the outer query's where
> clause.
>
> David J.
>
>
Thanks David, I hope I understood what you mean.

After adding the Id column, I came up with this query:

ris=# select lag.id, lag.idtask, lag.code, lag.lg from (select idtask, code, id, lag(code, -1) over () as lg from tasks_test) as lag;
id | idtask | code | lg
----+--------+------+----
1 | 1 | R | S
2 | 1 | S | D
3 | 1 | D | F
4 | 1 | F | T
5 | 1 | T | R
6 | 2 | R | S
7 | 2 | S | T
8 | 2 | T | F
9 | 2 | F |
(9 rows)

Row nº 7 meets the condition, but I don't want to show only that row, I
would like to show this:

6 | 2 | R | S
7 | 2 | S | T
8 | 2 | T | F
9 | 2 | F |

Any hint?.

--
Leonardo M. Ramé
Medical IT - Griensu S.A.
Av. Colón 636 - Piso 8 Of. A
X5000EPT -- Córdoba
Tel.: +54(351)4246924 +54(351)4247788 +54(351)4247979 int. 19
Cel.: +54 9 (011) 40871877

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Alvaro Herrera 2014-03-31 19:14:19 Re: Wanted: ALTER TRIGGER ... OWNED BY EXTENSION
Previous Message Igor Neyman 2014-03-31 19:07:37 Re: getting the current query from pg_stat_activity