Re: Usando GROUP BY

From: Emiliano Moscato <moski666(at)gmail(dot)com>
To: Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Usando GROUP BY
Date: 2009-03-05 12:29:41
Message-ID: 4388f4180903050429j32241f02lcc34cd4361905d90@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Moski

2009/3/4 Jaime Casanova <jcasanov(at)systemguards(dot)com(dot)ec>:
> 2009/3/4 Emiliano Moscato <moski666(at)gmail(dot)com>:
>> Hola a todos!
>>
>> Cada tanto me encuentro con el mismo tipo de problema haciendo queries
>> en postgres. Supongamos que tenemos el ejemplo del tutorial de
>> Postgres (http://www.postgresql.org/docs/8.1/static/tutorial-agg.html)
>>
>> SELECT city, max(temp_lo)
>>    FROM weather
>>    GROUP BY city;
>>
>>     city      | max
>> ---------------+-----
>>  Hayward       |  37
>>  San Francisco |  46
>> (2 rows)
>>
>> pero además querría saber en que fecha ocurrió dicha temperatura. Cuál
>> sería la manera "más correcta" de hacerlo?
>>
>
> en que fecha o en que "fechas"... el hecho de que haya habido una
> temperatura maxima no significa que haya ocurrido una sola vez...

Sí, me alcanzaría con que muestre todos los dias en que apareció la máxima.

>
>> En mis tiempos de Mysql hacía algo del estilo, haciendo uso de los
>> abusos del standard por parte de MYSQL:
>>
>> SELECT city, max(temp_lo), date
>>    FROM weather
>>    GROUP BY city;
>>
>
> lo cual claramente es incorrecto porque no estas definiendo que fecha
> del grupo deseas obtener (es decir del grupo de veces en que en city
> llego a haber temp_lo temperatura)

En mi ejemplo original habrá una sola "temperatura" máxima. Claramente
el ejemplo es una abstracción, quizás no la más feliz.

>
>> pero en Postgres,si hago esto, me reclama que date no debe estar en el
>> group by.
>
> sera que te reclama que "debe" estar?
exacto, error mío.

>
>> Claramente, esto no sería útil, dado que al ponerlo en el
>
> define "util"

Útil sería un resultado que no me muestre las temperaturas de TODAS
las ciudades en TODAS las fechas, dado que el máximo ya no me daría la
máxima por ciudad sino que me daría la máxima por ciudad y por día.
Esto claramente no es lo que enuncié al principio, que es saber qué
días ocurrió la máxima.
>
>> group by, me desagrega la maxima temperatura de la ciudad por dias.
>>
>
> en realidad lo agrupa por ciudad y fecha... no lo desagrega... ah!
> bueno, eso es semantica!!!

Gracias por la ironía.
>
>> Cuál sería la manera correcta de hacer este query?
>>
>
> solo llego hasta aqui, no se me ocurre forma de filtrarlo mas... mas
> que con una funcion...
>
> SELECT city, date, temp_lo
>  FROM weather
>  WHERE (city,temp_lo) IN (SELECT city, max(temp_lo)
>                                           FROM weather
>                                         GROUP BY city)
>

Esta está buena, yo quería evitar un subquery, pero veo que no será
posible. De todas maneras, conociendo que solo tendré un resultado por
ciudad en el subquery no se si es lo más eficiente.

Gracias por responder, fue útil a pesar de tus ironías.

Moski

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Emiliano Moscato 2009-03-05 12:32:53 Re: Usando GROUP BY
Previous Message Cesar Erices 2009-03-05 12:07:34 Re: Ayuda para PL/pgsql