选择已排序子组的最大行

问题描述

使用PostgreSQL 11,我有一个表,其中包含每个月每一天的DAY和MONTH_TO_DAY条目。我想为每个帐户选择最新的MONTH_TO_DAY条目。 我的桌子是:

+------+------------+--------------+------------+--------------------------+
|id    |account     |code          |interval    |timestamp                 |
+------+------------+--------------+------------+--------------------------+
|387276|ALPBls6EsP  |52            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387275|ALPBls6EsP  |52            |DAY         |2020-09-01 01:05:00.000000|
|387272|YkON8lk8A8  |25            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387271|YkON8lk8A8  |25            |DAY         |2020-08-01 01:05:00.000000|
|387273|ALPBls6EsP  |32            |MONTH_TO_DAY|2020-08-31 01:05:00.000000|
|387274|ALPBls6EsP  |32            |DAY         |2020-08-31 01:05:00.000000|
|387272|ALPBls6EsP  |27            |MONTH_TO_DAY|2020-08-30 01:05:00.000000|
|387271|ALPBls6EsP  |27            |DAY         |2020-08-30 01:05:00.000000|
+------+------------+--------------+------------+--------------------------+

如果有帮助,则条目始终按时间降序排列。

在查询所有帐户的查询中,由于第31天是08的最后一天,而第1天是09的最新条目,因此我的预期输出将是

+------+------------+--------------+------------+--------------------------+
|id    |account     |code          |interval    |timestamp                 |
+------+------------+--------------+------------+--------------------------+
|387276|ALPBls6EsP  |52            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387272|YkON8lk8A8  |25            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387273|ALPBls6EsP  |32            |MONTH_TO_DAY|2020-08-31 01:05:00.000000|
+------+------------+--------------+------------+--------------------------+

我当时想我想按月份对条目进行分组(截断dd / hh / ss),然后选择每个组中具有最大时间戳的行。这样我可以得到正确的行,但是我不知道如何获得其他任何字段。

SELECT max(timestamp) 
FROM mytable 
GROUP BY date_trunc('month',mytable.timestamp);

我还认为我可以在下面类似的东西上使用distinct,但是我不太熟悉distance on或date_trunc,我不知道如何一起使用它们。

SELECT distinct on (timestamp)
    *
FROM mytable
ORDER BY date_trunc('month',mytable.timestamp)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)