只有一个生效日期,sql逻辑实现添加截止日期,截止日期为下次的生效日期

qq_27610695 2017-09-30 04:01:24

按照职务代码分组,组内生效日期排序;
这次的生效日期怎样变为上次的截止日期,并且拼接到最后?;
如果生效日期是最新的,截止日期为其他显示;
跪求大佬写sql查询,通过查询得出第二张表,或者怎样etl处理可以实现表二。
职务代码 生效日期 描述 职务代码 生效日期 描述 截止日期
1 1月 A 1 1月 A 2月
1 2月 B 1 2月 B 无穷
2 2月 E 2 2月 E 3月
2 3月 F 2 3月 F 无穷
...全文
319 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2017-10-01
  • 打赏
  • 举报
回复
如果你的数据库是SQL Server2012+ 也可以用LEAD


with t1(职务代码,生效日期,描述) as
(
select '1', N'1月', 'A' union all
select '1', N'2月', 'B' union all
select '2', N'2月', 'E' union all
select '2', N'3月', 'F'
)
SELECT *,ISNULL(LEAD(生效日期)OVER(PARTITION BY 职务代码 ORDER BY  生效日期),N'无穷') AS 截止日期  FROM t1

职务代码	生效日期	描述	截止日期
1	1月	A	2月
1	2月	B	无穷
2	2月	E	3月
2	3月	F	无穷
  • 打赏
  • 举报
回复
lead 直接可以指定默认null值
with t1(职务代码,生效日期,描述) as
(
select '1', N'1月', 'A' union all
select '1', N'2月', 'B' union all
select '2', N'2月', 'E' union all
select '2', N'3月', 'F'
)
SELECT *,LEAD(生效日期,1,N'无穷')OVER(PARTITION BY 职务代码 ORDER BY  生效日期) AS 截止日期  FROM t1
职务代码	生效日期	描述	截止日期
1	1月	A	2月
1	2月	B	无穷
2	2月	E	3月
2	3月	F	无穷
zbdzjx 2017-09-30
  • 打赏
  • 举报
回复
with t1(职务代码,生效日期,描述) as
(
select '1', '1月', 'A' union all
select '1', '2月', 'B' union all
select '2', '2月', 'E' union all
select '2', '3月', 'F'
)
, t2 as
(
select 职务代码,生效日期,描述, CONVERT(int, replace(生效日期, '月', '')) 生效日期2 from t1
)
, t3 as
(
select 职务代码,生效日期,描述, 生效日期2, ROW_NUMBER() over(partition by 职务代码  order by 生效日期2) rn from t2
)
select a.职务代码, a.生效日期, a.描述
, case when b.rn is null then '无穷' else b.生效日期 end 截止日期 
from t3 a left join t3 b on a.职务代码=b.职务代码 and a.rn=b.rn-1

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧