引言
最近有一个统计的需求,一个案件在崔记中有多条记录,我们需要根据崔记表中的最新一条记录来判断此时案件的状态,并且需要按天统计,也就说今天的最新案件状态,不能覆盖掉昨天的案件的最新状态。
刚开始我用了mysql 中的一个求差集ide函数,sql如下:
SELECT COUNT(1) FROM robot_collection_record AS b WHERE NOT EXISTS ( SELECT 1 FROM robot_collection_record WHERE case_id = b.case_id AND b.create_time <![CDATA[ < ]]>create_time )
这条SQL语句实现查询结果的去重并且通过字段排序,其中case_id是去重的字段,create_time是排序的字段。
但是当我在查看结果的时候发现,只有统计今天的数量是正确的,但是如果加上一些条件,统计历史数据就会出现问题。
最后自己动手直接写了一个sql,来满足上面需求:
SELECT COUNT(1) FROM robot_collection_record a WHERE a.create_time IN ( SELECT m.createTime FROM ( SELECT DISTINCT (q.case_id), max(q.create_time) createTime FROM ( SELECT * FROM robot_collection_record WHERE partner_id = ${partnerId} AND ${startTime} <![CDATA[ <= ]]> create_time AND create_time <![CDATA[ <= ]]> ${endTime} ) q GROUP BY q.case_id ) m ) AND a.robot_answer_state = 1;
上面的sql就可以满足了。
小结
其实这个需求还是比较常见,但是这需要我们根据自己的表设计和一些业务需求,来转换成我们的sql,所以sql功底在一些图标统计功能上还是比较明显,如果我们能灵活的运用一些mysql内置的函数,写起sql还是非常精简的,小编的sql功底很是不好呀,还需要在这上面下工夫。