我有 emp 表,它包含許多列,并且員工可以在
他/她的記錄發生變化的旁邊有很多行。它沒有主鍵,因為 emp id 可以
在員工值旁邊重復。
有一列"health",它描述了健康狀況,with values(heart,skin,null) etc..
并且modification_date對于健康列中值的每次更改,假設員工編號 1 有心臟問題,因為在健康列中注冊的第一條記錄然后員工康復了,然后添加了第二行和列健康=null ,
有時員工因另一種疾病“皮膚”而生病
如果值變為空或其他值,如果他/她的列(健康)已更改為任何健康值,如何獲取員工編號?
有什么幫助嗎?
select empid, health_status from
(
select e.emp_id empid, e.health health_status,
count(e.health) over (partition by e.emp_id order by e.modification_date asc) sick_count
from emp e
)
where sick_count > 1
uj5u.com熱心網友回復:
似乎您需要計算NULLs 和NOT-NULLs。NVL2()函式很適合計算這個,例如
SELECT e.emp_id, e.health,
SUM(NVL2(health,1,0)) OVER (PARTITION BY e.emp_id) AS "Sick",
SUM(NVL2(health,0,1)) OVER (PARTITION BY e.emp_id) AS "Got well"
FROM emp e
如果健康是NOT-NULL那么第二個引數將回傳,否則第三個引數將回傳。順便說一句,使用ORDER BY子句將是多余的。
uj5u.com熱心網友回復:
從 Oracle 12 開始,您可以使用MATCH_RECOGNIZE來查找生病、康復然后再次生病的員工:
SELECT emp_id
FROM emp
MATCH_RECOGNIZE (
PARTITION BY emp_id
ORDER BY modification_date
PATTERN (sick well sick)
DEFINE
sick AS health IS NOT NULL
well AS health IS NULL
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/353185.html
