需求:媳婦兒最近擔憂寶寶的吃奶時間不夠規律,網上說是正常平均3小時餵奶一次,讓我記錄下每次的吃奶時間,分析下實際是否誤差很大,好在下次去醫院複查時反饋給醫生。
此外,還要注意有時候哭鬧要吃奶,而實際只吃了兩口便不吃了。這種狀況要特殊標記下,若是不算這種狀況的話,分析看是否正常。
環境:Oracle 11.2.0.4sql
我在本身的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'。session
因爲每次吃奶都要人爲的插入一條數據,爲了簡化這個運維操做,將插入語句保存到文件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',也就是說此次吃奶量很是少。code
也許有人禁不住會問,你這麼簡單的需求還把它弄到Oracle數據庫裏,還用SQL計算實現。什麼?你說你還要用到Oracle分析函數?
其實沒必要太較真了,適合本身的纔是最好的,我就是喜歡敲sqlplus不喜歡用Excel等工具,還能複習下分析函數,何樂而不爲呢。
廢話很少說,來看如何用分析函數顯示上次餵奶時間L_TIME:
select t.*, lag(feed_time) over(order by id) l_time from t_baby t;orm
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);get
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分鐘,也是正常的^_^