SELECT
DATE_FORMAT(create_time,'%Y%m%d')times, // 时间格式化
max(price) max_price, // 最高价
min(price) min_price, // 最低价
sum(num) num // 每天数量
first(price) first_prive // [开盘价]
last(price) last_prive // [收盘价]
FROM `bill` // 账单
GROUP BY `times` // 时间分组
请问下,我怎么查询到 first_prive,last_prive字段呢
###mysql里没有现成的方法,只能找一个变通的方法,就是先把所有值拼成一个长字符串,然后再从这个长字符串中取最前面和最后面的部分,但是这样会有性能问题,如果可以忍受性能问题,目前也没有别的好的办法:
SELECT
DATE_FORMAT(create_time, '%Y%m%d') times, // 时间格式化
MAX(price) max_price, // 最高价
MIN(price) min_price, // 最低价
SUM(num) num, // 每天数量
SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY create_time), ',', 1 ) first_price,
SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY create_time DESC), ',', 1 ) last_price
FROM `bill`
GROUP BY `times` // 时间分组
ORDER BY `times` // 时间排序
###
粗暴做法:
使用Mysql变量来完成上述操作。
先做一次分组查询,然后针对分组查询再做一次遍历,使用变量来取值,定义初始变量。
first_prive 与 last_price,first_prive 遇到 times 变化时取新price 值。
再对以上数据以相同逻辑倒序查询一次,获取last_price
这个功能为什么非要坚持在sql中完成,太复杂灵活了,建议挪到业务代码中。