微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何实现 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。