SELECT
current.RowID,
current.Value,
CASE WHEN
(
(current.Value < COALESCE(previous.Value, current.Value + 1))
AND
(current.Value < COALESCE(subsequent.Value, current.Value + 1))
)
THEN
'Minima'
ELSE
'Maxima'
END
FROM
myTable current
LEFT JOIN
myTable previous
ON previous.RowID = (SELECT MAX(RowID) FROM myTable WHERE RowID < current.ROWID)
LEFT JOIN
myTable subsequent
ON subsequent.RowID = (SELECT MIN(RowID) FROM myTable WHERE RowID > current.ROWID)
WHERE
(
(current.Value < COALESCE(previous.Value, current.Value + 1))
AND
(current.Value < COALESCE(subsequent.Value, current.Value + 1))
)
OR
(
(current.Value > COALESCE(previous.Value, current.Value - 1))
AND
(current.Value > COALESCE(subsequent.Value, current.Value - 1))
)
Примечание: Логика <и> скопирована с вас, но не обслуживает локальные максимумы / минимумы, которые равны для одной или нескольких последовательных записей.
Примечание: Я создал вымышленный RowID для объединения записей по порядку, важно лишь, чтобы объединения получали "предыдущие" и "последующие" записи.
Примечание: Операторы LEFT JOINs и COALESCE приводят к тому, что первое и последнее значения всегда считаются максимумами или минимумами.