Попробуйте это за высокий/низкий/объем
SELECT symbol,
date,
MAX(high) AS dailyhigh,
MIN(low) AS dailylow,
SUM(volume) AS dailyvolume
GROUP BY symbol, date
Вы получаете одну строку в день на одного символа.
Трудно сказать, как вы справляетесь с ценой открытия. Конечно, первая метка времени в вашей таблице, даже без даты, не является правильным методом. Итак, давайте выясним самую раннюю временную метку для каждой даты.
SELECT symbol,
date,
MIN(time) AS opentime
FROM a2a
GROUP BY symbol, date
Теперь нам нужно найти начальную цену за эту метку времени. Как это сделать? Это сделано немного сложнее, потому что у вас может быть более одной строки для определенного времени и даты для этой проблемы.
SELECT a.symbol,
a.date,
AVG (a.open) AS dailyopen
FROM a2a a
JOIN (
SELECT symbol,
date,
MIN(time) AS opentime
FROM a2a
GROUP BY symbol, date
) AS b ON a.symbol = b.symbol
AND a.date = b.date
AND a.time = b.opentime
GROUP BY a.symbol, a.date
Это выводит начальные записи (записи самого низкого времени) для каждого символа и даты.
Теперь мне кажется, что ваши закрывающие записи - это записи, имеющие временную метку 1730, или последнюю запись с временной меткой меньше 1730. Это превращается из мгновенного SQL в реальную работу, но это финансовые записи и Мэдофф находится в тюрьме, поэтому давайте сделаем все правильно. Вот время закрытия каждого символа на каждой дате.
SELECT symbol,
date,
MAX(time) AS closetime
FROM a2a
WHERE time <= 1730
GROUP BY symbol, date
Теперь нам нужна цена закрытия каждого символа на каждую дату. Мы восстановим это так же, как мы получили начальную цену.
SELECT a.symbol,
a.date,
AVG (a.close) AS dailyclose
FROM a2a a
JOIN (
SELECT symbol,
date,
MAX(time) AS closetime
FROM a2a
WHERE time <= 1730
GROUP BY symbol, date
) AS b ON a.symbol = b.symbol
AND a.date = b.date
AND a.time = b.closetime
GROUP BY a.symbol, a.date
Следующий шаг - объединить эти три сводных запроса вместе и ограничить диапазон дат, который вы обрабатываете.
SELECT d.symbol, d.date, d.dailyhigh, d.dailylow, d.dailyvolume,
o.dailyopen,
c.dailyclose
FROM (
/* the first summary query, daily high low volume */
) AS d
JOIN (
/* the second summary query, daily open */
) AS o ON d.symbol = o.symbol AND d.date = o.date
JOIN (
/* the third summary query, daily close */
) AS c ON d.symbol = c.symbol AND d.date = c.date
WHERE d.date >= DATE_FORMAT(NOW() - INTERVAL 3 DAY, '%Y%m%d')
AND d.date < DATE_FORMAT(NOW(), '%Y%m%d')
ORDER BY d.symbol, d.date
Это даст вам данные за три дня, оканчивающиеся на вчерашний день. Вы должны вырезать и вставлять три сводных запроса в это большое жирное соединение. Я как бы надеюсь, что вы это сделаете, потому что форматирование глубоко вложенных запросов, как это, не очень весело.
Это не просто, но он очень прост и ясен в отношении ваших бизнес-правил.
Пожалуйста, дайте нам описание вашей таблицы a2a, включая типы данных ваших столбцов 'date' и' time'. –