Вы можете выполнить условное агрегирование:
select
date_format(date, '%Y-%m-01') date_month,
sum(`close` > `open`) uptime,
sum(`close` < `open`) downtime,
sum(`close` = `open`) equaltime
stock_id
from mytable
group by date_month, stock_id
Обратите внимание, что я добавил дополнительный запрос для подсчета дней, где close
равно open
.