#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 экстремумов и выполнить объединение.)