first() and last() in mysql
May. 3rd, 2012 11:08 amНашел в доброй самаритянской сети решение для сносной имитации first() и last() функций агреггирования в mysql (кои отсуствуют, ну last() в особенности, first() типа работает если поле указать без всякой функции, но не очень гарантируется). Нужно это для финансовых веселых картинок. Когда есть таблица с потоком цен с их временем в точности до секунд и их надо агреггировать в более-менее сносную картинку с минутной резолюцией. Допустим, таблица prices имеет колонки ticker, tstmp и price (self-explanatory), тогда выбрать из нее минутную OHLC серию (Open/High/Low/Close) можно так:
select DATE_FORMAT( tstmp, '%Y%m%d%h%i' ) dtmp, min( price ) low, max( price ) high,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price AS CHAR ) ORDER BY tstmp ) , ',', 1 ) open,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price AS CHAR ) ORDER BY tstmp DESC ) , ',', 1 ) close
from prices where ticker = 'некий тикер'
GROUP BY DATE_FORMAT( tstmp, '%Y%m%d%h%i' )
Утверждается что open и close не подзапросы а такие ж функции агреггирования, как и честные min() и max(). Поверим, ага. Заодно установил еще одну беззаботность mysql - алиаснутая колонка в списке селекта не может использоваться по алиасу в условии where, приходится опять писать все выражение. Вот долбанаты болгарские пиэйчди. Ничего не могут написать за столько лет.
select DATE_FORMAT( tstmp, '%Y%m%d%h%i' ) dtmp, min( price ) low, max( price ) high,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price AS CHAR ) ORDER BY tstmp ) , ',', 1 ) open,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price AS CHAR ) ORDER BY tstmp DESC ) , ',', 1 ) close
from prices where ticker = 'некий тикер'
GROUP BY DATE_FORMAT( tstmp, '%Y%m%d%h%i' )
Утверждается что open и close не подзапросы а такие ж функции агреггирования, как и честные min() и max(). Поверим, ага. Заодно установил еще одну беззаботность mysql - алиаснутая колонка в списке селекта не может использоваться по алиасу в условии where, приходится опять писать все выражение. Вот долбанаты болгарские пиэйчди. Ничего не могут написать за столько лет.