Search Postgresql Archives

Re: Complex query

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux