Мне нужно взять первые N строк для каждой группы, упорядоченные по пользовательскому столбцу.
Учитывая следующую таблицу:
db=# SELECT * FROM xxx;
id | section_id | name
----+------------+------
1 | 1 | A
2 | 1 | B
3 | 1 | C
4 | 1 | D
5 | 2 | E
6 | 2 | F
7 | 3 | G
8 | 2 | H
(8 rows)
Мне нужны первые 2 строки (упорядоченные по имени ) для каждого section_id , т.е. результат похож на:
id | section_id | name
----+------------+------
1 | 1 | A
2 | 1 | B
5 | 2 | E
6 | 2 | F
7 | 3 | G
(5 rows)
Я использую PostgreSQL 8.3.5.
sql
postgresql
Кубер Сапарев
источник
источник
group by
?Начиная с v9.3 вы можете сделать боковое соединение
Это может быть быстрее, но, конечно, вы должны тестировать производительность конкретно на ваших данных и сценарии использования.
источник
t_inner.name
столбцамdistinct
не нужно. Пример показан в размещенной ссылке.distinct t_outer.section_id, t_top.*
Вот еще одно решение (PostgreSQL <= 8.3).
источник
источник
name
's' иid
's отсортированы в том же порядке, так что вы не увидите его. Сделайте имена в обратном порядке, и вы увидите, что эти запросы дают разные результаты.источник