返回最新“条纹”数据的行

时间:2012-04-04 02:51:28

标签: sql postgresql gaps-and-islands

给出一个包含以下数据的简单表:

 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

如何编写查询以使用PostgreSQL返回最新的丢失或连续行数?在这种情况下,我正在寻找结果:

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

我猜答案是使用lag()和分区语法,但我似乎无法确定它。

1 个答案:

答案 0 :(得分:3)

假设(正如你没说的那样)

  • result只有两个不同的值:(W, L)
  • id在最新条目id最高的意义上是顺序的。

这可以胜任:

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

这会获得WL的最新ID,这是前两者中的较早者。所以LIMIT 1得到了相反结果的最后一个条目。高于id的行形成最新的条纹。瞧。