В MySQL 8.0 это можно сделать с помощью lag()
. Предполагая, что вы хотите отсортировать строки по value
, это будет:
select value
from (
select
value,
lag(value, 1, 0) over(order by value) lag_value
from mytable t
) t
where value > lag_value * 1.10
Если вы хотите использовать другой столбец упорядочения, вы можете изменить предложение order by
, чтобы использовать соответствующий столбец.
В более ранних версиях один вариант является коррелированным подзапросом:
select value
from mytable t
where value > 1.10 * coalesce(
(
select t1.value
from mytable t1
where t1.value < t.value
order by t1.value desc
limit 1
),
0
)
Чтобы использовать здесь другой столбец упорядочения, вам нужно изменить предложение where
и предложение order by
в подзапрос.
С другой стороны, если вы хотите выбрать следующую строку в соответствии с соотношением к предыдущей выбранной строке, то это другой вопрос. Вам нужен какой-то итеративный процесс: в SQL одним подходом является рекурсивный запрос:
with
data as (
select value, row_number() over(order by value) rn
from mytable t
) d,
cte as (
select 1 is_valid, value, rn from data where rn = 1
union all
select
(d.value > 1.1 * c.value),
case when d.value > 1.1 * c.value then d.value else c.value end,
d.rn
from cte c
inner join data d on d.rn = c.rn + 1
)
select value from cte where is_valid order by value
Запрос перечисляет значения, затем последовательно просматривает набор данных, отслеживая последнее выбранное значение, и установка флагов для записей, которые должны появиться в окончательном наборе результатов.