维度表类型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)。我想根据另一个列(例如通用日期)找到一个列的第一个值更改。例如,员工...
使用lag()
: