mysql场景题:最近7天连续3天登陆用户,字段,id,date(已去重)

1.最近7天连续3天登陆用户,字段,id,date(已去重)

思路:

  1. lag对时间开窗(注意时间得转换为时间戳(int类型才可以添加后续条件),跳行为2(连续3天),前2行没有值的,默认为0

  2. 转化时间字段为时间戳减去它上2条的那条数据的时间戳,得出是否为连续登陆3天的差值(第三天减去第一天的时间戳为(2 * 24 * 60 * 60)

  3. Where 过滤出最近7天的数据

  4. 对id进行分组,过滤差值为2 * 24 * 60 * 60的数据

  5. 答案:

    select id
    from (select id, date, (unix_timestamp(date) - lag(unix_timestamp(date), 2, 0) over (partition by id order by date)) lo
    from toms) t1
    where date between date_sub(current_date(), interval 7 day) and current_date()
    group by id
    having min(lo) = 2 * 24 * 60 * 60;

2.字段,id,send_time(datetime类型),soc,需求:soc大于100并且持续5s会被告警,求出所有数据(告警和不告警),输出字段,id,send_time,soc,持续时间,告警状态(0:不告警,1:告警)

思路:

  • 判断soc是否大于100,如果是的给它一个自增项(用于对告警的数据进行分组),否则取0,得到字段flag

  • 对flag字段进行求出截止到当前的最大值,得到字段flag2,用于得到一整段分组的告警组

  • 对flag2字段进行开窗分组求充电时间最小值,得到字段over_time

  • 时间相减判断,如果大于5状态置为1

答案:

复制代码
select charge_id,
       soc,
       daq_time,
       timestampdiff(second, over_time, daq_time)                stay_length,
       if(timestampdiff(second, over_time, daq_time) >= 5, 1, 0) status
from (select *, min(daq_time) over (partition by flag2 order by daq_time) over_time
      from (select charge_id,
                   soc,
                   daq_time,
                   flag,
                   max(flag)
                       over (partition by charge_id order by daq_time rows between unbounded preceding and current row ) flag2
            from (select charge_id,
                         soc,
                         daq_time,
                         if(abs(soc) > 100, 0, row_number() over (partition by charge_id order by daq_time )) flag
                  from demo) t1) t2) t3;
相关推荐
哈里谢顿7 小时前
记录一次sql优化记录
mysql
数据大魔方7 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora8 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
萧曵 丶9 小时前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读
莳花微语10 小时前
记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理
数据库·sql·mysql
萧曵 丶11 小时前
MySQL三大日志系统浅谈
数据库·sql·mysql
麦聪聊数据13 小时前
MySQL 性能调优:从EXPLAIN到JSON索引优化
数据库·sql·mysql·安全·json
lalala_lulu13 小时前
MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?(超详细版)
数据库·mysql
CV工程师的自我修养14 小时前
你的SQL为什么慢?看懂MySQL EXPLAIN执行计划,快速定位性能瓶颈
数据库·mysql
y_想不到名字14 小时前
MySQL windows版本免安装
数据库·mysql