如何获取第一次记录后发生的任何更改值的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】:

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

【讨论】:

以上是关于如何获取第一次记录后发生的任何更改值的emp id的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

如何获取表中的所有数据,如果在一列中重复相同的值,该行应该计数一次?

如何根据两个逗号分隔值的列中的任何一个值获取记录

如何更改组合框选定值的显示顺序

Ext JS:如何在具有多个列值的网格中查找记录

如何仅选择至少一个值与前一行发生更改的行