如何通过SQL获取Oracle表中某行的列的第一次更改?

问题描述 投票:0回答:1

维度表类型2记录了一行随时间变化(SCD)。我想根据另一个列(例如通用日期)找到一个列的第一个值更改。

例如,具有(emp_id,insert_date,state,address)的employee表,其中status表示工作,not_working,休假等(一些固定值)。比方说,这家奇怪的公司每天都在监视员工。现在我想知道员工在过去一年中何时开始上一次假期。以下内容无效

select distinct empid, max(insert_date) where status = 'vacation'
where insert_date > today - 1 year --- know not correct syntax but to simplify
group by empid 

因为它将选择状态为休假的最后一条记录,但可能会有许多记录处于休假状态,因为记录可能由于其他原因而发生了更改,例如地址更改等,例如:

emp_id insert_dt status     address
1      9/1/2019   working   123
1      9/2/2019   working   1234
1      9/3/2019   vacation  1234
1      9/4/2019   vacation  12345   --- address change
1      9/5/2019   working   12345

因此,我希望从工作状态到休假状态的第一次转换是9/3(不是9/4),而min也不起作用。

我们不能更改表模式,也不能更改PL / SQL,也不能使用某些编程语言等中嵌入的SQL,只能使用普通SQL。如果您知道Oracle中有任何(分析)函数可以运行lambda或使用编码列等模拟它,那将是理想的选择。

谢谢S

维度表类型2记录了一行随时间变化(SCD)。我想根据另一个列(例如通用日期)找到一个列的第一个值更改。例如,员工...

sql database oracle data-warehouse
1个回答
0
投票

使用lag()

© www.soinside.com 2019 - 2024. All rights reserved.