Установка границ диапазона в SQL

#sql

#sql

Вопрос:

У меня есть база данных со столбцом под названием «level», в котором хранятся целые числа с шагом от 1 вверх.

Я хотел бы запустить оператор select (который также будет иметь различные другие условия), чтобы получить те строки, которые являются первыми и последними для каждого «уровня», то есть границы каждого уровня. Но у меня есть десятки миллионов записей, поэтому хотелось бы сделать это наиболее эффективным из возможных способов.

Есть предложения?

Комментарии:

1. как бы вы определили, какие строки на каждом уровне являются «первыми» и «последними»?

2. Этот вопрос задавался много раз в SO — сначала вам следует выполнить поиск. В общем, вам нужно указать, как определять порядок (т. Е. первый и последний), и что делать с дубликатами.

Ответ №1:

Я вызову переменную, которая определяет first и last something . Я полагаю, что это временная метка, но вы нам не сказали.

Если вам нужен один столбец из строки, то

  SELECT level, MAX(something) as maxie, MIN(something) as minnie
    FROM mytable
    GROUP BY level;
  

Если вам нужна целая строка, обязательно используйте базу данных с функциями управления окнами

  SELECT DISTINCT first_value(mytable) over www, last_value(mytable) over www 
 FROM mytable
 WINDOW www as (partition by level order by level, something 
    RANGE BETWEEN unbounded preceding AND unbounded following);
  

Если они выполняются слишком медленно, могут быть некоторые хитрости, основанные на умном индексировании level и something . Я все еще изучаю управление окнами, которое является новым для Postgres 9, но уже много лет работает в Oracle. (Этого нет в MySQL; там вам, вероятно, нужно получить PKS экстремумов и выполнить объединение.)