【发布时间】:2019-11-21 23:18:37
【问题描述】:
维度表类型 2 记录一行随时间的变化 (SCD)。我想根据另一列说日期找到列的第一个值更改(应该是常见模式)。
例如,带有 (emp_id, insert_date, status, address) 的员工表,其中状态表示工作、不工作、假期等(一些固定值)。比如说,这家奇怪的公司每天都在密切关注员工。现在我想知道员工在过去一年的最后一个假期是什么时候开始的。以下将不起作用
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
【问题讨论】:
标签: sql database oracle data-warehouse