Re: Complex query - Mailing list pgsql-general

From Leonardo M. Ramé
Subject Re: Complex query
Date
Msg-id 20140331190822.GC10833@leonardo-laptop
Whole thread Raw
In response to Re: Complex query  (David Johnston <polobo@yahoo.com>)
Responses Re: Complex query  (David Johnston <polobo@yahoo.com>)
List 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



pgsql-general by date:

Previous
From: Igor Neyman
Date:
Subject: Re: getting the current query from pg_stat_activity
Next
From: Alvaro Herrera
Date:
Subject: Re: Wanted: ALTER TRIGGER ... OWNED BY EXTENSION