zoukankan      html  css  js  c++  java
  • 如何使用SQL计算宝宝每次吃奶的时间间隔(文末含PPT)

    编者的话:搞好SQL可以做很多事情,比如说可以解决海盗分金的问题,可以用SQL把大象装进冰箱,还可以用SQL解决环环相扣的刑侦推理问题,近期,有位读者朋友投稿了“使用SQL计算宝宝每次吃奶的时间间隔”,大家可以一起借鉴下~

    需求


    媳妇儿最近担心宝宝的吃奶时间不够规律,网上说是正常平均3小时喂奶一次,让我记录下每次的吃奶时间,分析下实际是否偏差很大,好在下次去医院复查时反馈给医生。

    此外,还要注意有时候哭闹要吃奶,而实际只吃了两口便不吃了。这种情况要特殊标记下,如果不算这种情况的话,分析看是否正常。


    环境


    Oracle 11.2.0.4

    1.记录每次吃奶时间

    2.计算吃奶时间间隔

    1. 记录每次吃奶时间



    我在自己的Oracle测试环境中创建了一张表t_baby,用于实现记录宝宝每次的吃奶时间:

    test@DEMO> desc t_baby
     Name                                      Null?    Type
     ----------------------------------------- -------- ------------
     ID                                        NOT NULL NUMBER
     FEED_TIME                                 NOT NULL DATE
     LABEL                                              VARCHAR2(1)

    注意:这里的LABEL字段就是用于标志吃奶量的。

    默认值设置为'N',代表吃奶量正常;如果吃奶量很少,则可将对应记录的LABEL字段值手工更新为'L';如果吃奶量非常多,超过正常值,则更新为'M'。

    由于每次吃奶都要人为的插入一条数据,为了简化这个运维操作,将插入语句保存到文件i.sql中,内容如下:

    test@DEMO> get i
      1  PROMPT Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
      2* insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
    test@DEMO>

    这样每次执行插入就可以方便的直接@i调用插入,比如刚刚媳妇儿告知我本次吃奶时间是13:16,那直接调用插入即可:

    test@DEMO> @i
    Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
    Enter value for feed_time: 1213 13:16
    old   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
    new   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 08:00','mmdd hh24:mi'))
    
    1 row created.
    
    test@DEMO> commit;
    
    Commit complete.

    确认刚刚插入的数据无误后,一定要记得提交事物。我之所以没有将commit写到脚本中,就是为了当发现数据输入有误,方便直接rollback回滚。

    现在我们来看一下现有的数据,详细记录了每一次的吃奶时间:

    test@DEMO> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
    
    Session altered.
    
    test@DEMO> select * from t_baby;
    
            ID FEED_TIME           LABEL
    ---------- ------------------- -----
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N
             8 2019-12-13 09:01:00 N
             9 2019-12-13 10:40:00 L
            15 2019-12-13 11:50:00 N
            16 2019-12-13 13:16:00 N
    
    6 rows selected.

    可以看到ID=9这条记录的LABEL='L',也就是说这次吃奶量非常少。


    2.计算吃奶时间间隔


    也许有人禁不住会问,你这么简单的需求还把它弄到Oracle数据库里,还用SQL计算实现。什么?你说你还要用到Oracle分析函数?

    其实不必太较真了,适合自己的才是最好的,我就是喜欢敲sqlplus不喜欢用Excel等工具,还能复习下分析函数,何乐而不为呢。
    废话不多说,来看如何用分析函数显示上次喂奶时间L_TIME:
    select t.*, lag(feed_time) over(order by id) l_time from t_baby t;

    test@DEMO> select t.*, lag(feed_time) over(order by id) l_time from t_baby t;
    
            ID FEED_TIME           L L_TIME
    ---------- ------------------- - -------------------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N 2019-12-13 02:49:00
             8 2019-12-13 09:01:00 N 2019-12-13 04:58:00
             9 2019-12-13 10:40:00 L 2019-12-13 09:01:00
            15 2019-12-13 11:50:00 N 2019-12-13 10:40:00
            16 2019-12-13 13:16:00 N 2019-12-13 11:50:00
    
    6 rows selected.

    然后直接查询计算下喂奶间隔即可,以分钟为单位:
    select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)"
    from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t);

    test@DEMO> select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t);
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
             9 2019-12-13 10:40:00 L         99
            15 2019-12-13 11:50:00 N         70
            16 2019-12-13 13:16:00 N         86
    
    6 rows selected.

    媳妇儿主要担心是喂奶间隔太短,会不会撑到宝宝,那如果说我们假定间隔在2h以上都是正常的话,那么对应的也就是LAG(min)>120分钟以上的为正常。
    从目前已有的数据来看,的确异常次数比较多。
    而我们之前说到存在喂奶量极少的情况,如果将这种情况排除在外呢?再重新计算:
    select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)"
    from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L');

    test@DEMO> select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L');
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
            15 2019-12-13 11:50:00 N        169
            16 2019-12-13 13:16:00 N         86

    这下可以看到数据趋于正常,只有一次喂奶间隔在120分钟以下了。当然目前数据还比较少,后续数据多了才可以更准确的反映出异常的比例。

    因为会经常查询到这个间隔时间。将这个两个语句分别保存为v1.sql和v2.sql,方便后续使用。

    test@DEMO> l
      1* select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t)
    test@DEMO> save v1 rep
    Wrote file v1.sql
    
    test@DEMO> l
      1* select id, feed_time, label, round((feed_time - l_time) * 24 * 60, 2) "LAG(min)" from (select t.*, lag(feed_time) over(order by id) l_time from t_baby t where label <> 'L')
    test@DEMO> save v2 rep
    Wrote file v2.sql
    
    test@DEMO> @v1
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
             9 2019-12-13 10:40:00 L         99
            15 2019-12-13 11:50:00 N         70
            16 2019-12-13 13:16:00 N         86
    
    6 rows selected.
    
    test@DEMO> @v2
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
            15 2019-12-13 11:50:00 N        169
            16 2019-12-13 13:16:00 N         86
    
    test@DEMO>

    最后总结下,实际以后每次记录喂奶时间直接@i输入具体时间,每次查喂奶间隔就根据实际需求看@v1或者@v2就ok,确认无误后提交更改,再实际熟悉下整个流程:

    --1.插入喂奶时间:
    test@DEMO> @i
    Please input your feed_time(mmdd hh24:mi). eg:1213 08:00
    Enter value for feed_time: 1213 16:30
    old   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('&feed_time','mmdd hh24:mi'))
    new   1: insert into t_baby(id,feed_time) values(s1.nextval,to_date('1213 16:30','mmdd hh24:mi'))
    
    1 row created.
    
    --2.查看喂奶间隔:
    test@DEMO> @v1
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
             9 2019-12-13 10:40:00 L         99
            15 2019-12-13 11:50:00 N         70
            16 2019-12-13 13:16:00 N         86
            19 2019-12-13 16:30:00 N        194
    
    7 rows selected.
    
    --3.查看喂奶间隔(排除Label='L'的情况):
    test@DEMO> @v2
    
            ID FEED_TIME           L   LAG(min)
    ---------- ------------------- - ----------
             6 2019-12-13 02:49:00 N
             7 2019-12-13 04:58:00 N        129
             8 2019-12-13 09:01:00 N        243
            15 2019-12-13 11:50:00 N        169
            16 2019-12-13 13:16:00 N         86
            19 2019-12-13 16:30:00 N        194
    
    6 rows selected.
    
    --4.确认无误提交事物:
    test@DEMO> commit;
    
    Commit complete.
    
    test@DEMO>

    可以清楚看到最新的一次喂奶间隔是194分钟,也是正常的^_^


    关于《2019数据技术嘉年华PPT》共有两个获取途径:

    1. 在“数据和云”公众号后台回复:2019dtc,即可下载ppt及观看视频!

    2. 在“墨天轮”上,已按13个会场整理了目前所有已经开放的PPT,大家可以选择感兴趣的主题下载,详情:https://www.modb.pro/db/11553,复制到网页中打开,即可查看!

    另:本次嘉年华视频已新鲜出炉(5人拼团可免费观看)

    详情:https://www.modb.pro/course/38

    复制到网页中打开或点击“阅读原文”,立刻观看!

    扩展阅读


    1. 2019年12月数据库流行度排行:前三甲高位收官 数据库重获增长趋势

    2. 下一代企业级数据库系统综述

    3. 揭秘“关于GaussDB数据库的五大谎言”

    4. 数据库技术和生态的发展演进

    5. 论云数据库的前世今生未来

    6. 新一代分布式数据库是怎样的?

    7. 听德哥说PostgreSQL为何这么火?

    8. 如何“暴力破解”Oracle性能优化的极端问题(附精彩案例解读)

    9. 真实世界Oracle故障诊断之一千零一夜

    10. 荐书:《Redis 使用手册》(留言送书)

    数据和云

    ID:OraNews

    如有收获,请划至底部,点击“在看”,谢谢!

    资源下载

    关注公众号:数据和云(OraNews)回复关键字获取

    help,30万+下载的完整菜单栏

    2019DTCC,数据库大会PPT

    2018DTCC , 数据库大会PPT

    2018DTC,2018 DTC 大会 PPT

    ENMOBK《Oracle性能优化与诊断案例》

    DBALIFE,“DBA 的一天”海报

    DBA04,DBA 手记4 电子书

    122ARCH,Oracle 12.2体系结构图

    2018OOW,Oracle OpenWorld 资料

    产品推荐

    云和恩墨BethuneX  企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!

    云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。

    云和恩墨大讲堂 | 一个分享交流的地方

    长按,识别二维码,加入万人交流社群

    请备注:云和恩墨大讲堂

      

      点个“在看”  

     你的喜欢会被看到???? 

  • 相关阅读:
    关于技术开发部员工培训文稿
    关于CLR、CIL、CTS、CLS、CLI、BCL和FCL
    MSIL(IL)百科
    汇编百科
    exe文件百科
    解释一下.net平台的语言无关性和语言继承性
    关于视频流媒体服务器的学习记录
    Ubuntu18.04的下载与安装(全过程纪录)
    记主板的南桥芯片和北桥芯片作用及区别(“干南桥”)
    我的Java资料小栈-START
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311860.html
Copyright © 2011-2022 走看看