问题描述
我们有如下数据:
事实表:
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 是德里的结束日期和孟买的开始日期..
我已经尝试过声明变量和传递值的解决方案,但是当我们有数千行时这是不可行的..
解决方法
您可以在此处使用 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;
Demo
编辑:
要将上述选择保存到新表中,请使用:
SELECT (id,end_date,isactive) INTO yourNewTable
FROM (
-- the exact select from above
) t;