Re: Unique - first

Поиск
Список
Период
Сортировка
От Thomas Kellerer
Тема Re: Unique - first
Дата
Msg-id l4j47u$dsf$1@ger.gmane.org
обсуждение исходный текст
Ответ на Unique - first  (Robert James <srobertjames@gmail.com>)
Ответы Re: Unique - first  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
Robert James wrote on 27.10.2013 14:04:
> I have a table (x,y,z) - I'd like to take the rows with unique x
> values - but, when more than one row have the same x value, I want the
> one with the minimal z value.
>
> How can I do that? I can imagine doing it with window functions, but
> also that regular SQL should be able to do it too.
>
>

Window functions *are* "regular" SQL ;)

select x,y,z
from (
   select x,y,z,
          min(y) over (partition by x) as min_y
   from the_table
) t
where y = min_y;

Instead of min() you could also use row_number() or dense_rank() to find the minimum value.

A solution without window functions could be something like:

select t1.x, t1.y, t1.z
from table t1
   join (select t2.x, min(t2.y) as min_y
         from the_table t2
         group by t2.x
   ) mt on mt.x = t1.x and mt.min_y = t1.y;

But I'm pretty sure the solution with the window function will perform better.





В списке pgsql-general по дате отправления:

Предыдущее
От: Robert James
Дата:
Сообщение: Unique - first
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Segmentation fault: pg_upgrade 9.1 to 9.3: pg_dump: row number 0 is out of range 0..-1