Как выбрать 3 записи с максимальным значение PostgreSQL?

Ссылка скопирована
1 ответ

Как сделать выборку 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)

Нужно решить такую задачу?

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

Заказать помощь
Лучший ответ
1
Роман IT Ответ

Для выбора трех записей с максимальным значением в PostgreSQL можно воспользоваться подзапросом в команде SELECT.

Пример запроса:

SELECT *
FROM your_table
ORDER BY your_column DESC
LIMIT 3;

SELECT * FROM your_table ORDER BY your_column DESC LIMIT 3;

Где:
- your_table - название таблицы, из которой вы хотите выбрать записи
- your_column - название столбца, по которому вы хотите найти максимальные значения

Этот запрос сначала отсортирует записи в таблице по убыванию значения вашего столбца, а затем с помощью оператора LIMIT выберет только первые три записи (с максимальными значениями).

Не забудьте заменить your_table и your_column на реальные значения из вашей базы данных.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно