4

Given a simple table with the following data:

 id | result | played ----+--------+------------ 7 | L | 2012-01-07 6 | L | 2012-01-06 5 | L | 2012-01-05 4 | W | 2012-01-04 3 | W | 2012-01-03 2 | L | 2012-01-02 1 | W | 2012-01-01 

How would I write a query to return the lastest losing or winning streak of rows using PostgreSQL? In this case, I'm looking for a result of:

 id | result | played ----+--------+------------ 7 | L | 2012-01-07 6 | L | 2012-01-06 5 | L | 2012-01-05 

I'm guessing the answer is to use lag() and partition syntax, but I can't seem to nail it down.

1
  • Are the numbers in id sequential without holes? Or are the dates in played? What is your version of PostgreSQL? Commented Apr 4, 2012 at 3:24

1 Answer 1

3

Assuming (as you don't tell) that

  • there are exactly two distinct values for result: (W, L).
  • id is sequential in the sense that the latest entry has the highest id.

This would do the job:

SELECT * FROM tbl WHERE id > ( SELECT max(id) FROM tbl GROUP BY result ORDER BY max(id) LIMIT 1 ); 

This gets the latest id for W and L, the earlier of the two first. So a LIMIT 1 gets the last entry of the opposite outcome. Rows with an id higher than that form the latest streak. Voilá.

Sign up to request clarification or add additional context in comments.

1 Comment

Nice. I ended up dropping the assumption that the ids are in sequence by using the 'played' date field instead.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.