我有emp表,它包含许多列,并且一个员工可以在
更改了他/她的记录。它没有主键,因为emp id可以
在员工值旁边重复。
有一个专栏"health"
,它描述了健康和with values(heart,skin,null) etc..
对于健康列中的值的每次改变,假设1号雇员有心脏问题,因为在健康列中登记了第一个记录,然后该雇员恢复健康,然后添加第二行和列health=null,
有时,员工会患上另一种疾病“皮肤”。
如果他/她的列(Health),如何获取员工编号
如果值变为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
发布于 2021-11-08 19:32:57
看起来你需要计算NULL
s和NOT-NULL
s的个数。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
子句将是多余的。
发布于 2021-11-08 21:33:33
在Oracle12中,您可以使用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://stackoverflow.com/questions/69888846
复制相似问题