如何实现 scd 类型 2 以进行以下操作

问题描述

我们有如下数据:

事实表:

id | key   | name    | salary | loaction | start_date
1  | emp_1 | Shubham | 10000  | Delhi    | 1998-02-01
2  | emp_2 | Ashish  | 12000  | Pune     | 2000-01-01
3  | emp_3 | Shubham | 15000  | Mumbai   | 2002-01-01

预期输出

id | key   | name    | salary | loaction | start_date | end_date   | inactive
1  | emp_1 | Shubham | 10000  | Delhi    | 1998-02-01 | 2002-01-01 | 0
2  | emp_2 | Ashish  | 12000  | Pune     | 2000-01-01 | null       | 1
3  | emp_3 | Shubham | 15000  | Mumbai   | 2002-01-01 | null       | 1

我想实现这个。

我们在事实表和 emp_key 中有开始日期,它是唯一的,并且想要创建一个暗表,我们必须在其中显示 isactive 标志以及开始日期和结束日期。 结束日期将与下一个位置的开始日期相同。例如 shubham 2002-01-01 是德里的结束日期和孟买的开始日期..

请给出sql-server的解决方案。

我已经尝试过声明变量和传递值解决方案,但是当我们有数千行时这是不可行的..

解决方法

您可以在此处使用 LEAD 分析函数:

SELECT
    id,[key],name,salary,location,start_date,LEAD(start_date) OVER (PARTITION BY [key] ORDER BY start_date) end_date,CASE WHEN LEAD(start_date) OVER
              (PARTITION BY [key] ORDER BY start_date) IS NOT NULL
         THEN 0 ELSE 1 END isactive
FROM yourTable
ORDER BY id;

screen capture from demo link below

Demo

编辑:

要将上述选择保存到新表中,请使用:

SELECT (id,end_date,isactive) INTO yourNewTable
FROM (
    -- the exact select from above
) t;