Sıralanmış alt grupların maksimum satırlarını seçin
PostgreSQL 11 kullanarak, her ayın her günü için DAY ve MONTH_TO_DAY girişlerini içeren bir tablom var. Her hesap için en son MONTH_TO_DAY girişini seçmek istiyorum. Benim masam:
+------+------------+--------------+------------+--------------------------+
|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|
+------+------------+--------------+------------+--------------------------+
Yardımcı olursa, girişler her zaman zamana göre azalan sıradadır.
Tüm hesapları soran bir sorguda, 31'inci 08'in son günü ve 1'inin 09'un en son girişi olması nedeniyle, beklediğim çıktı
+------+------------+--------------+------------+--------------------------+
|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|
+------+------------+--------------+------------+--------------------------+
Girişleri aya göre gruplamak (gg / hh / ss'yi kısaltmak) ve ardından her grupta maksimum zaman damgasına sahip satırı seçmek istediğimi düşünüyordum. Bununla doğru satırları alabilirim ama diğer alanlardan herhangi birini nasıl elde edeceğimi bulamıyorum.
SELECT max(timestamp)
FROM mytable
GROUP BY date_trunc('month', mytable.timestamp);
Ayrıca aşağıdaki gibi bir şey için farklı kullanabileceğimi düşündüm, ancak farklı on veya date_trunc konusunda pek aşina değilim ve bunları birlikte nasıl kullanacağımı bulamıyorum.
SELECT distinct on (timestamp)
*
FROM mytable
ORDER BY date_trunc('month', mytable.timestamp)
Yanıtlar
İstiyorsunuz distinct on
, ancak şunlara uygulamak istiyorsunuz account
:
select distinct on (account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by account, timestamp desc;
Eğer en geç istiyorsanız account
tarafından month
, o zaman bu çalışması gerekir:
select distinct on (date_trunc('month', timestamp), account) *
from mytable
where interval = 'MONTH_TO_DAY'
order by date_trunc('month', timestamp), account, timestamp desc;