因个人工作上遇见一些问题,一直困惑于无法解决,昨日偶尔看见一个博主的方法,特地转载过来,用来备份,谢谢那位博主。
问题场景: 需要取用户截至查询时间最近时间对于的数据 比如购买的商品,但是同时因为维度关系,需要进行去重,比如跟进用户+用户类别去重。因此在库表底层的需要对时间进行排序,然后根据用户和类别进行去重。
其实就是 order by 和 group by的使用。
但是当我写出 在子查询order by 之后在外层查询写上group by 并不能取出最大/小的值。
因此当时曲线救国,使用
SUBSTRING_INDEX(
GROUP_CONCAT(
A.ID
ORDER BY
A.CreateTime DESC SEPARATOR '|'
),
'|',
1
)
GROUP_CONCAT( A.ID ORDER BY A.CreateTime DESC SEPARATOR '|' )
Group_concat函数是先根据创建时间进行排序,然后在全部合并在一起,以’|'分开
最后使用 SUBSTRING_INDEX函数取第一个字符串来达到目的。
但是这样的查询,在我的报表因使用很多个,导致报表运行过慢,查询时间过长。
(实际还有where条件句中使用max/min函数的方法,但是代码运行效率一样很差,还不如GROUP_CONCAT作为子查询方便)
而昨日,发现了,order by group by的正确使用发法。
————————————————
这里把链接放上:
作者:Whiterock_Lelik
来源:优快云
原文:https://blog.youkuaiyun.com/lglaljj123/article/details/79864188