sql编写

Purplme 2018-12-05 11:02:33

code invtp date
1001 A 2018-01-01
1001 B 2018-03-02
1001 C 2018-04-01
1002 AA 2018-01-01
1002 BB 2018-02-28
1003 CC 2018-01-01
结果:
code invtp start_date end_date
1001 A 2018-01-01 2018-03-01
1001 B 2018-03-02 2018-03-30
1001 C 2018-04-01 3000-12-31
1002 AA 2018-01-01 2018-02-27
1002 BB 2018-02-28 3000-12-31
1003 CC 2018-01-01 3000-12-31

怎么实现?
...全文
511 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39007465 2019-01-03
  • 打赏
  • 举报
回复
Dear SQL大佬的这个lead over用的好,学到了!
morliz子轩 2018-12-26
  • 打赏
  • 举报
回复
还是二十六大师兄看的细致。
Dear SQL(燊) 2018-12-11
  • 打赏
  • 举报
回复
sql server 2016+
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL 
    DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[code] NVARCHAR(10)
,[invtp] NVARCHAR(10)
,[date] DATE   
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'1001',N'A',N'2018-01-01')
INSERT INTO dbo.[t] VALUES(N'1001',N'B',N'2018-03-02')
INSERT INTO dbo.[t] VALUES(N'1001',N'C',N'2018-04-01')
INSERT INTO dbo.[t] VALUES(N'1002',N'AA',N'2018-01-01')
INSERT INTO dbo.[t] VALUES(N'1002',N'BB',N'2018-02-28')
INSERT INTO dbo.[t] VALUES(N'1003',N'CC',N'2018-01-01')


SELECT *,enddate=isnull(dateadd(day,-1,lead([date])over(order by code,invtp)) ,'3000-12-31')
FROM T

code       invtp      date       enddate
---------- ---------- ---------- ----------
1001       A          2018-01-01 2018-03-01
1001       B          2018-03-02 2018-03-31
1001       C          2018-04-01 2017-12-31
1002       AA         2018-01-01 2018-02-27
1002       BB         2018-02-28 2017-12-31
1003       CC         2018-01-01 3000-12-31

二月十六 版主 2018-12-06
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([code] int,[invtp] nvarchar(22),[date] Date)
Insert #T
select 1001,N'A','2018-01-01' union all
select 1001,N'B','2018-03-02' union all
select 1001,N'C','2018-04-01' union all
select 1002,N'AA','2018-01-01' union all
select 1002,N'BB','2018-02-28' union all
select 1003,N'CC','2018-01-01'
Go
--测试数据结束
;WITH cte AS (
Select *,ROW_NUMBER()OVER(ORDER BY code,invtp) rn from #T
)
SELECT a.code,
       a.invtp,
       a.date AS start_date,
       ISNULL(b.date, '3000-12-31') AS end_date
FROM cte a
    LEFT JOIN cte b
        ON a.rn + 1 = b.rn
           AND b.code = a.code;

吉普赛的歌 版主 2018-12-06
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL 
	DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[code] NVARCHAR(10)
,[invtp] NVARCHAR(10)
,[date] DATE	
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'1001',N'A',N'2018-01-01')
INSERT INTO dbo.[t] VALUES(N'1001',N'B',N'2018-03-02')
INSERT INTO dbo.[t] VALUES(N'1001',N'C',N'2018-04-01')
INSERT INTO dbo.[t] VALUES(N'1002',N'AA',N'2018-01-01')
INSERT INTO dbo.[t] VALUES(N'1002',N'BB',N'2018-02-28')
INSERT INTO dbo.[t] VALUES(N'1003',N'CC',N'2018-01-01')

;WITH cte AS (
	SELECT row_number() OVER (ORDER BY code,invtp) AS rid,* 
	FROM t
)
SELECT 
a.code
,a.invtp
,a.[date] AS [start_date]
,isnull(dateadd(day,-1,b.[date]),'3000-12-31') AS [end_date]
FROM cte AS a LEFT JOIN cte AS b ON a.rid=b.rid-1
/*
code       invtp      start_date end_date
---------- ---------- ---------- ----------
1001       A          2018-01-01 2018-03-01
1001       B          2018-03-02 2018-03-31
1001       C          2018-04-01 2017-12-31
1002       AA         2018-01-01 2018-02-27
1002       BB         2018-02-28 2017-12-31
1003       CC         2018-01-01 3000-12-31
 */
早起晚睡 2018-12-06
  • 打赏
  • 举报
回复
没说明就直接得到后面的数据!!

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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