Я думаю, вы хотите:
select h.slug,
min(case when replace(usd, '$', '') + 0 = min_usd then usd end) as min_usd,
min(case when replace(usd, '$', '') + 0 = min_usd then usd end) as min_date,
max(case when replace(usd, '$', '') + 0 = max_usd then usd end) as max_usd,
min(case when replace(usd, '$', '') + 0 = max_usd then usd end) as max_date
from historical h join
(select slug, min(replace(usd, '$', '') + 0) as min_usd,
max(replace(usd, '$', '') + 0) as max_usd
from historical
group by slug
) s
on h.slug = s.slug
group by h.slug;
Вычисление для min()
и max()
довольно сложно, потому что вы сохраняете значение в виде строки.Я настоятельно рекомендую хранить значение в виде десятичного / числового типа.Это подходит для валют.
РЕДАКТИРОВАТЬ:
Вопрос немного изменился.Соответствующий запрос выглядит так:
select h.slug,
min(case when usd + 0 = min_usd then usd end) as min_usd,
min(case when usd + 0 = min_usd then usd end) as min_date,
max(case when usd + 0 = max_usd then usd end) as max_usd,
min(case when usd + 0 = max_usd then usd end) as max_date
from historical h join
(select slug, min(usd + 0) as min_usd,
max(usd + 0) as max_usd
from historical
group by slug
) s
on h.slug = s.slug
group by h.slug;
Все + 0
нужны только в том случае, если usd
хранится в виде строки.В остальном числовые сравнения в порядке.