PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Има ли оператор на postgre CLOSEST?

Може и да съм малко по-забавен от синтаксиса, но тази параметризирана заявка (всички ? вземат '1' от оригиналния въпрос) трябва да работи бързо, основно 2 претърсвания в B-Tree [ако приемем, че броят е индексиран].

SELECT * FROM
(
  (SELECT id, number FROM t WHERE number >= ? ORDER BY number LIMIT 1) AS above
  UNION ALL
  (SELECT id, number FROM t WHERE number < ? ORDER BY number DESC LIMIT 1) as below
) 
ORDER BY abs(?-number) LIMIT 1;

Планът на заявката за това с таблица от ~5e5 реда (с индекс на number ) изглежда така:

psql => explain select * from (
        (SELECT id, number FROM t WHERE number >= 1 order by number limit 1) 
        union all
        (select id, number from t where number < 1 order by number desc limit 1)
) as make_postgresql_happy 
order by abs (1 - number) 
limit 1;
                                                  QUERY PLAN
--------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.24..0.24 rows=1 width=12)
   ->  Sort  (cost=0.24..0.24 rows=2 width=12)
         Sort Key: (abs((1::double precision - public.t.number)))
         ->  Result  (cost=0.00..0.23 rows=2 width=12)
               ->  Append  (cost=0.00..0.22 rows=2 width=12)
                     ->  Limit  (cost=0.00..0.06 rows=1 width=12)
                           ->  Index Scan using idx_t on t  (cost=0.00..15046.74 rows=255683 width=12)
                                 Index Cond: (number >= 1::double precision)
                     ->  Limit  (cost=0.00..0.14 rows=1 width=12)
                           ->  Index Scan Backward using idx_t on t  (cost=0.00..9053.67 rows=66136 width=12)
                                 Index Cond: (number < 1::double precision)
(11 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да ограничим достъпа до база данни в PostgreSQL

  2. PostgreSQL:как да инсталирате разширение plpythonu

  3. psql:не можа да се свърже със сървър:Няма такъв файл или директория (Mac OS X)

  4. Най-добрият начин за преброяване на записи на произволни интервали от време в Rails+Postgres

  5. Скорост на съкращаване на Postgresql