首页 > 解决方案 > 如何获取第一次记录后发生的任何更改值的emp id

问题描述


我有 emp 表,它包含许多 colmuns 并且员工可以在他/她的记录发生更改的旁边有很多行。它没有主键,因为 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

标签: sqloracleoracle12c

解决方案


似乎您需要计算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子句将是多余的。


推荐阅读