PostgreSQL按日期提升最大值

时间:2014-02-28 11:08:10

标签: sql postgresql design-patterns postgresql-9.2

我想从结果表中随时间提取值可能上下波动的最大值列表。例如,板球高分数据库会有很多结果,但我想列出哪个击球手的最高一天得分与该记录达到的日期相比。

虽然检查前一行的CTE似乎很接近,但我无法找到此类查询的模式。有人可以帮助使用模式名称或实现此查询的有效方法示例吗?

示例数据

Value | date
1| 1/1/1970
2| 2/1/1970
1| 3/1/1970
2| 4/1/1970
1| 5/1/1970
3| 6/1/1970
10| 22/1/1970
4 | 1/12/1970
7 | 22/5/1975

预期结果

Value | date
1|  1/1/1970
2|  2/1/1970
3|  6/1/1970
10| 22/1/1970

我开始认为自我加入会很好。

2 个答案:

答案 0 :(得分:1)

如果我了解数据和结果,您似乎想要第一天那天特定值被击中。您可以使用聚合执行此操作,但使用min()函数:

select value, min(date) as date
from table t
group by value;

至少,这将在问题中为您提供所需的结果。

编辑:

所以你想要累积最大值的第一个日期。你也可以得到这个。

select cummax, min(date) as date
from (select date, max(value) over (order by date) as cummax
      from table t
     ) t
group by cummax;

答案 1 :(得分:1)

可以通过简单地LEFT JOIN使用前一个行并检查其中max(value)是否小于当前行(或第NULL行来完成)

SELECT t1.value
       ,t1.date
FROM Table1 AS t1
  LEFT JOIN Table1 AS t2
    ON t1.date > t2.date
GROUP BY 
  t1.id
HAVING
  max(t2.value) IS NULL 
  OR max(t2.value) < t1.value
ORDER BY t1.date;

Fiddle