SQL日志表数据检索:特定时段操作statement查询及限制难题
嘿,我完全懂你卡在「限制需求」这块儿的纠结!先帮你把基础查询捋清楚,再针对几种最常见的限制场景给出具体SQL,你可以对照自己的实际需求来调整~
基础查询:获取指定时间段被操作的Statement
先确认下你已经能实现的基础逻辑,确保咱们起点一致:
SELECT DISTINCT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30';
这里用DISTINCT是为了避免同一个statement被多次操作后重复输出,如果你不需要去重可以直接去掉。
接下来是几种高频的「限制需求」场景,看看是不是你遇到的情况:
场景1:限定操作的用户范围
比如你只想找这段时间里仅被某特定用户操作过的statement,或者要排除被某用户操作的statement:
-- 仅被用户1001操作过的Statement SELECT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' GROUP BY statement_id HAVING COUNT(DISTINCT user_id) = 1 AND MIN(user_id) = 1001; -- 排除被用户1002操作过的Statement SELECT DISTINCT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' AND statement_id NOT IN ( SELECT statement_id FROM operation_logs WHERE user_id = 1002 AND action_date BETWEEN '2018-03-01' AND '2018-03-30' );
场景2:限定操作类型
比如只找这段时间里执行过特定操作的statement,或者同时执行过多种操作的statement:
-- 至少执行过DELETE操作的Statement SELECT DISTINCT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' AND action_type = 'DELETE'; -- 同时执行过CREATE和UPDATE操作的Statement SELECT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' AND action_type IN ('CREATE', 'UPDATE') GROUP BY statement_id HAVING COUNT(DISTINCT action_type) = 2;
场景3:限定操作次数
比如找这段时间被操作超过N次的statement,或者仅被操作过1次的statement:
-- 操作次数超过5次的Statement(附带次数统计) SELECT statement_id, COUNT(*) AS total_actions FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' GROUP BY statement_id HAVING COUNT(*) > 5; -- 仅被操作过1次的Statement SELECT statement_id FROM operation_logs WHERE action_date BETWEEN '2018-03-01' AND '2018-03-30' GROUP BY statement_id HAVING COUNT(*) = 1;
如果这些场景都不是你面临的问题,你可以再补充下具体的限制要求——比如是要排除某些操作组合、和操作时间做更精细的关联,还是其他特殊规则?我再帮你针对性调整SQL语句~
内容的提问来源于stack exchange,提问作者Sates
相关产品推荐
相关产品推荐

