LINUX.ORG.RU

[postgresql] группировка

 


0

0

Что-то я туплю... Как из такой таблички:

id | group_id | value
----+----------+-----
1 | 1 | a
2 | 1 | b
3 | 1 | c
4 | 2 | d
5 | 3 | e
6 | 3 | f
7 | 4 | g

получить такую:

id | group_id | value
----+----------+-----
3 | 1 | c
4 | 2 | d
6 | 3 | f
7 | 4 | g

те выбрать в каждой группе строку с максимальным id.

в mysql это делается так:

select max(id), value from t group by group_id;

а вот в postgresql:

ERROR: колонка "t.value" должна фигурировать в выражении GROUP BY или использоваться в агрегатной функции...


Ответ на: комментарий от borisych

Да нет это дает вообще другой результат.

Можно конечно написать вот так:
select id, group_id, value from t where id in
(select max(id) from t group by group_id);

но хочется более стройного решения без подзапросов потому и обратился к присутствующим

xtron
() автор топика
Ответ на: комментарий от borisych

сорри ваш запрос то-же подходит, но он как и мой чуть выше приведенный позапрос, а хотелось бы более стройного решения и что-то мне подсказывает что оно возможно просто я туплю...

xtron
() автор топика
Ответ на: комментарий от xtron

тот запрос что я привел достаточно классический, если не нравится, то вот Вам оракловый без подзапроса, правда съест ли постгрес хз:

SELECT DISTINCT
group_id,
LAST_VALUE (VALUE) OVER (PARTITION BY GROUP_ID),
MAX (id) OVER (PARTITION BY GROUP_ID)
FROM t

borisych ★★★★★
()
Ответ на: комментарий от borisych

>тот запрос что я привел достаточно классический, если не нравится, то >вот Вам оракловый без подзапроса, правда съест ли постгрес хз:

>SELECT DISTINCT

>group_id,

>LAST_VALUE (VALUE) OVER (PARTITION BY GROUP_ID),

>MAX (id) OVER (PARTITION BY GROUP_ID)

>FROM t


ой, а я тут как раз про оконные функции отписал. не заметил твой камент.

собсно топикстартеру, возьми на заметку, как пользоваться аналитикой. если постгресовцы сделали аналог ораклового, то должно подойти.

Deleted
()
Ответ на: комментарий от borisych

чет я облажался, правильно так:

SELECT DISTINCT
GROUP_ID,
LAST_VALUE(VALUE)
OVER (PARTITION BY GROUP_ID
ORDER BY id
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING),
MAX (id) OVER (PARTITION BY GROUP_ID)
FROM t

borisych ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.