mysql group里获取第一个和最后一个

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字段呢

阅读 8.2k
2 个回答

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中完成,太复杂灵活了,建议挪到业务代码中。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题