如何获取第一次记录后发生的任何更改值的emp id
Posted
技术标签:
【中文标题】如何获取第一次记录后发生的任何更改值的emp id【英文标题】:how to get emp id for any change values happend after first record 【发布时间】:2021-12-21 14:38:42 【问题描述】:我有一张临时表
它包含许多 colmun,一个员工可以在 旁边有很多行
他/她的记录发生了变化。它没有主键,因为 emp id 可以在员工值旁边重复。
有一列 "health"
,它描述健康状况,with values(heart,skin,null) etc..
和 modification_date
用于健康列中值的每次变化
假设 1 号员工的心脏问题作为健康列中注册的第一条记录
然后员工康复了,然后添加了第二行和第二列 health=null ,
有时员工会因另一种疾病“皮肤”而生病
如果他/她的列(健康)如何获取员工编号 如果值变为 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
【问题讨论】:
我不明白你在追求什么。员工可以生病并再次康复。那么你想知道什么?员工是否曾经生病?员工现在是否生病了?员工有多少病?还有什么? 请edit 包含minimal reproducible example 的问题:CREATE TABLE
表的声明;一些样本数据的INSERT
语句;该样本数据的预期输出;并解释为什么需要该输出。
【参考方案1】:
在 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
);
【讨论】:
【参考方案2】:看来您需要计算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
子句将是多余的。
【讨论】:
以上是关于如何获取第一次记录后发生的任何更改值的emp id的主要内容,如果未能解决你的问题,请参考以下文章
如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?