выберите первым в групповом запросе - PullRequest
0 голосов
/ 03 февраля 2012

Извинения, если на этот вопрос уже был дан ответ.

Скажите, у меня есть следующая таблица:

colA | colB | colC
-----|------|-----
a    | 1    | 9
a    | 2    | 8
b    | 1    | 4
b    | 2    | 3
b    | 1    | 3
c    | 5    | 1
c    | 4    | 2

и я хочу выбрать первую строку из каждой группы (столбца a, если отсортирован по столбцу b, c asc)

colA | colB | colC
-----|------|-----
a    | 1    | 9
b    | 1    | 3
c    | 4    | 2

Какой самый простой способ структурировать запрос для получения этих результатов?

(Postgresql 9)

Спасибо, П.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Помимо ответа "mu is too short" с использованием оконных функций (к которым меня также привлек колледж), я обнаружил, что могу добиться функциональности, используя гораздо более простую функцию "Different on":

select distinct on (colA) * from tbl order by colA, colB, colC;
1 голос
/ 03 февраля 2012

Вы можете использовать оконную функцию и производную таблицу:

select cola, colb, colc
from (
    select cola, colb, colc,
           rank() over (partition by cola order by colb, colc asc) as r
    from your_table
) as dt
where r = 1

Оконные функции довольно удобны и должны быть в каждом наборе инструментов SQL.

0 голосов
/ 03 февраля 2012

Раньше у меня была та же проблема, что и у вас. Я использовал оконную функцию и производную таблицу, чтобы решить эту проблему.

...