PostgreSQL按日期递增最大值
我想从一个随时间变化的结果表中提取一个值可以上下波动的最大值列表。例如,一个板球高分数据库会有很多结果,但我想列出哪个击球手的一天得分最高,而不是达到该记录的日期 虽然CTE检查前一行似乎很接近,但我还无法找到这种类型查询的模式。是否有人可以提供模式名称或实现此查询的有效方法的示例 示例数据PostgreSQL按日期递增最大值,sql,postgresql,design-patterns,postgresql-9.2,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 |
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
我开始认为自我加入会很好 如果我了解数据和结果,您似乎希望第一天达到某个特定值。您可以使用聚合来完成此操作,但使用
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;
只需将该行与前一行进行左连接,并检查其中的
max(value)
是否小于当前行(或第一行的NULL
),即可完成此操作
选择t1.value
,t1.date
从表1中取t1
左键将表1连接为t2
在t1.date>t2.date
分组
t1.id
有
最大值(t2.value)为空
或最大值(t2.值)
请添加示例数据(sqlfiddle Prefered)和示例输出。因此,基本上您需要每个值的min()日期?否。如果以前没有使用过某个值,则这完全不相关。我想知道某个分数何时大于该分数日期之前的所有分数(示例数据中的值)。恐怕不行。已经添加了更多数据。选择你喜欢的运动。我在约会后订了高分记录。
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;