Muszę wziąć pierwsze N wierszy dla każdej grupy, uporządkowane według niestandardowej kolumny.
Biorąc pod uwagę poniższą tabelę:
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)
Potrzebuję pierwszych 2 wierszy (uporządkowanych według nazwy ) dla każdego section_id , czyli wyniku podobnego do:
id | section_id | name
----+------------+------
1 | 1 | A
2 | 1 | B
5 | 2 | E
6 | 2 | F
7 | 3 | G
(5 rows)
Używam PostgreSQL 8.3.5.
sql
postgresql
Kouber Saparev
źródło
źródło
group by
?Od wersji 9.3 możesz wykonać połączenie boczne
To to być szybsze, ale oczywiście powinieneś przetestować wydajność specjalnie na danych i przypadku użycia.
źródło
t_inner.name
kolumniedistinct
nie jest potrzebne. Przykład jest pokazany w opublikowanym linku poshest.distinct t_outer.section_id, t_top.*
Oto inne rozwiązanie (PostgreSQL <= 8.3).
źródło
źródło
name
„iid
” są sortowane w tej samej kolejności, więc ich nie zobaczysz. Utwórz nazwy w odwrotnej kolejności, a zobaczysz, że te zapytania dają różne wyniki.źródło