引言
最近有一个统计的需求,一个案件在崔记中有多条记录,我们需要根据崔记表中的最新一条记录来判断此时案件的状态,并且需要按天统计,也就说今天的最新案件状态,不能覆盖掉昨天的案件的最新状态。
刚开始我用了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 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} create_time
AND create_time ${endTime}
) q
GROUP BY
q.case_id
) m
)
AND a.robot_answer_state = 1;
上面的sql就可以满足了。
小结
其实这个需求还是比较常见,但是这需要我们根据自己的表设计和一些业务需求,来转换成我们的sql,所以sql功底在一些图标统计功能上还是比较明显,如果我们能灵活的运用一些mysql内置的函数,写起sql还是非常精简的,小编的sql功底很是不好呀,还需要在这上面下工夫。