2017-08-22 1 views
1

J'ai la structure de table PostgreSQL suivante, qui rassemble les enregistrements de température pour chaque seconde:Récupérer des colonnes supplémentaires sur l'opérateur d'agrégation et la date

+----+--------+-------------------------------+---------+ 
| id | value |    date    | station | 
+----+--------+-------------------------------+---------+ 
| 1 |  0 | 2017-08-22 14:01:09.314625+02 |  1 | 
| 2 |  0 | 2017-08-22 14:01:09.347758+02 |  1 | 
| 3 | 25.187 | 2017-08-22 14:01:10.315413+02 |  1 | 
| 4 | 24.937 | 2017-08-22 14:01:10.322528+02 |  1 | 
| 5 | 25.187 | 2017-08-22 14:01:11.347271+02 |  1 | 
| 6 | 24.937 | 2017-08-22 14:01:11.355005+02 |  1 | 
| 18 | 24.875 | 2017-08-22 14:01:17.35265+02 |  1 | 
| 19 | 25.187 | 2017-08-22 14:01:18.34673+02 |  1 | 
| 20 | 24.875 | 2017-08-22 14:01:18.355082+02 |  1 | 
| 21 | 25.187 | 2017-08-22 14:01:19.361491+02 |  1 | 
| 22 | 24.875 | 2017-08-22 14:01:19.371154+02 |  1 | 
| 23 | 25.187 | 2017-08-22 14:01:20.354576+02 |  1 | 
| 30 | 24.937 | 2017-08-22 14:01:23.372612+02 |  1 | 
| 31 |  0 | 2017-08-22 15:58:53.576238+02 |  1 | 
| 32 |  0 | 2017-08-22 15:58:53.590872+02 |  1 | 
| 33 | 26.625 | 2017-08-22 15:58:54.59986+02 |  1 | 
| 38 | 26.375 | 2017-08-22 15:58:56.593205+02 |  1 | 
| 39 |  0 | 2017-08-21 15:59:40.181317+02 |  1 | 
| 40 |  0 | 2017-08-21 15:59:40.190221+02 |  1 | 
| 41 | 26.562 | 2017-08-21 15:59:41.182622+02 |  1 | 
| 42 | 26.375 | 2017-08-21 15:59:41.18905+02 |  1 | 
+----+--------+-------------------------------+---------+ 

Je veux maintenant récupérer la valeur maximale pour chaque heure, ainsi que les données associé à cette entrée (id, date). En tant que tel, j'ai essayé les éléments suivants:

select max(value) as m, (date_trunc('hour', date)) as d 
from temperature 
where station='1' 
group by (date_trunc('hour', date)); 

Ce qui fonctionne très bien (fiddle), mais je ne reçois que les colonnes m et d en conséquence. Si j'essaie maintenant d'ajouter les colonnes ou id à l'instruction SELECT, j'obtiens l'erreur habituelle column "temperature.id" must appear in the GROUP BY clause or be used in an aggregate function.

J'ai déjà essayé des approches telles que celles décrites here, malheureusement en vain, comme par exemple je semble être incapable d'effectuer une jointure sur les colonnes date_trunc -generated.

Le résultat que je vise est la suivante:

+----+--------+-------------------------------+---------+ 
| id | value |    date    | station | 
+----+--------+-------------------------------+---------+ 
| 3 | 25.187 | 2017-08-22 14:01:10.315413+02 |  1 | 
| 33 | 26.625 | 2017-08-22 15:58:54.59986+02 |  1 | 
| 41 | 26.562 | 2017-08-21 15:59:41.182622+02 |  1 | 
+----+--------+-------------------------------+---------+ 

Il n'a pas d'importance record a été récupéré dans le cas où deux ou plusieurs entrées ont la même valeur.

Répondre

1

distinct on:

select distinct on (date_trunc('hour', date)) * 
from temperature 
where station = '1' 
order by date_trunc('hour', date), value desc 

Fiddle

+0

Il semble que je me suis tellement concentré sur l'utilisation maximum que je négligé cette option. Merci! – martinarroyo