Select 已排序子组的最大行数
Select the maximum rows of sorted subgroups
使用 PostgreSQL 11,我有一个 table 包含一个 DAY 和每个月的每一天的 MONTH_TO_DAY 条目。我想 select 每个帐户的最新 MONTH_TO_DAY 条目。
我的 table 是:
+------+------------+--------------+------------+--------------------------+
|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 每组中具有最大时间戳的行。我可以用这个得到正确的行,但我不知道如何得到任何其他字段。
SELECT max(timestamp)
FROM mytable
GROUP BY date_trunc('month', mytable.timestamp);
我还认为我可以在类似下面的东西上使用 distinct,但我对 distinct on 或 date_trunc 不太熟悉,我不知道如何一起使用它们。
SELECT distinct on (timestamp)
*
FROM mytable
ORDER BY date_trunc('month', mytable.timestamp)
你确实想要 distinct on
,但你想将它应用到 account
:
select distinct on (account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by account, timestamp desc;
如果您想要 month
的 account
的最新消息,那么这应该有效:
select distinct on (date_trunc('month', timestamp), account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by date_trunc('month', timestamp), account, timestamp desc;
使用 PostgreSQL 11,我有一个 table 包含一个 DAY 和每个月的每一天的 MONTH_TO_DAY 条目。我想 select 每个帐户的最新 MONTH_TO_DAY 条目。 我的 table 是:
+------+------------+--------------+------------+--------------------------+
|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 每组中具有最大时间戳的行。我可以用这个得到正确的行,但我不知道如何得到任何其他字段。
SELECT max(timestamp)
FROM mytable
GROUP BY date_trunc('month', mytable.timestamp);
我还认为我可以在类似下面的东西上使用 distinct,但我对 distinct on 或 date_trunc 不太熟悉,我不知道如何一起使用它们。
SELECT distinct on (timestamp)
*
FROM mytable
ORDER BY date_trunc('month', mytable.timestamp)
你确实想要 distinct on
,但你想将它应用到 account
:
select distinct on (account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by account, timestamp desc;
如果您想要 month
的 account
的最新消息,那么这应该有效:
select distinct on (date_trunc('month', timestamp), account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by date_trunc('month', timestamp), account, timestamp desc;