Как выбрать 3 записи с максимальным значение PostgreSQL?
Как сделать выборку 3-х записей у которых значение заданного поля больше всех
Дополнительно:
Отсортировать и указать лимит выдачи. Буквально. А в чем вопрос? Что у вас не получилось?
- Если я не ошибаюсь, такой запрос будет занимать некоторое время, разве нет других вариантов запросов с более больше скоростью выполнения?
- Kendric Folkin, почему он будет занимать много времени?
- FanatPHP, не думаю что база данных с 2 млн записей от сортируется за 1 секунду, или я не прав?
- Kendric Folkin, а почему именно за одну? Скажем, для веб-страницы одна секунда - это очень много. Запросы должны отрабатывать в идеале за сотые доли секунды.
Но в целом, как я понимаю, у вас чисто умозрительные проблемы?
-
не думаю что база данных с 2 млн записей от сортируется за 1 секунду, или я не прав?
Угу. Неправ. Может, сортировка вообще не нужна... ибо мысль человеческая придумала индексы.
- Kendric Folkin, почитайте про индексы. В индексе ссылки на записи уже отсортированы, достаточно выбрать первые три записи по этому индексу. Это будет работать за миллисекунды независимо от размера базы. От размера базы будет зависеть скорость вставки в такую большую таблицу. При этом сложность вычисления индекса будет логарифмической, то есть log(2e6), а это примерно 20~21 шаг для бинарного поиска по индексу размером в 2 ляма. Тоже быстро.
Так что получение топ N элементов при наличии нужного индекса будет очень эффективной операцией. Указание сортировки по индексированным полям в SQL-запросе всего лишь указывает порядок обхода таблицы. Её не придётся перебирать всю. - Ох уж эти мыслители, нет бы взять и попробовать
d1=# create table t(id int not null generated always as identity, val text); CREATE TABLE d1=# insert into t (val) select md5(x::text) from generate_series(1, 2000000) x; INSERT 0 2000000 d1=# create index ix_t_id on t (id); CREATE INDEX d1=# create index ix_t_val on t (val); CREATE INDEX d1=# analyze t; ANALYZE d1=# explain analyze select * from t order by id desc limit 3; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.43..0.53 rows=3 width=37) (actual time=1.948..1.952 rows=3 loops=1) -> Index Scan Backward using ix_t_id on t (cost=0.43..68618.43 rows=2000000 width=37) (actual time=1.946..1.949 rows=3 loops=1) Planning Time: 1.820 ms Execution Time: 2.121 ms (4 rows) d1=# explain analyze select * from t order by val desc limit 3; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.55..0.78 rows=3 width=37) (actual time=1.492..1.500 rows=3 loops=1) -> Index Scan Backward using ix_t_val on t (cost=0.55..154347.15 rows=2000000 width=37) (actual time=1.489..1.496 rows=3 loops=1) Planning Time: 0.183 ms Execution Time: 1.530 ms (4 rows)
d1=# create table t(id int not null generated always as identity, val text); CREATE TABLE d1=# insert into t (val) select md5(x::text) from generate_series(1, 2000000) x; INSERT 0 2000000 d1=# create index ix_t_id on t (id); CREATE INDEX d1=# create index ix_t_val on t (val); CREATE INDEX d1=# analyze t; ANALYZE d1=# explain analyze select * from t order by id desc limit 3; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.43..0.53 rows=3 width=37) (actual time=1.948..1.952 rows=3 loops=1) -> Index Scan Backward using ix_t_id on t (cost=0.43..68618.43 rows=2000000 width=37) (actual time=1.946..1.949 rows=3 loops=1) Planning Time: 1.820 ms Execution Time: 2.121 ms (4 rows) d1=# explain analyze select * from t order by val desc limit 3; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=0.55..0.78 rows=3 width=37) (actual time=1.492..1.500 rows=3 loops=1) -> Index Scan Backward using ix_t_val on t (cost=0.55..154347.15 rows=2000000 width=37) (actual time=1.489..1.496 rows=3 loops=1) Planning Time: 0.183 ms Execution Time: 1.530 ms (4 rows)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для выбора трех записей с максимальным значением в PostgreSQL можно воспользоваться подзапросом в команде SELECT.
Пример запроса:
SELECT * FROM your_table ORDER BY your_column DESC LIMIT 3;
Где:
- your_table - название таблицы, из которой вы хотите выбрать записи
- your_column - название столбца, по которому вы хотите найти максимальные значения
Этот запрос сначала отсортирует записи в таблице по убыванию значения вашего столбца, а затем с помощью оператора LIMIT выберет только первые три записи (с максимальными значениями).
Не забудьте заменить your_table и your_column на реальные значения из вашей базы данных.