Sql 从特定记录的日期范围派生开始日期和结束日期

Sql 从特定记录的日期范围派生开始日期和结束日期,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,使用SQLServer2008 我有一个记录编号和一个列,其中包含“输入”和“输出”数据以及与之相关的一些日期。 我想根据标准导出它们的开始日期和结束日期。最小日期成为开始日期,下一个日期成为结束日期。一条记录可以有多个输入和输出。下面是一个示例查询,尝试了很少的选项,但没有任何效果 IF OBJECT_ID('tempdb..#tmp_Info') IS NOT NULL DROP TABLE #tmp_Info IF OBJECT_ID('tempdb..#RN') IS NOT NULL

使用SQLServer2008

我有一个记录编号和一个列,其中包含“输入”和“输出”数据以及与之相关的一些日期。 我想根据标准导出它们的开始日期和结束日期。最小日期成为开始日期,下一个日期成为结束日期。一条记录可以有多个输入和输出。下面是一个示例查询,尝试了很少的选项,但没有任何效果

IF OBJECT_ID('tempdb..#tmp_Info') IS NOT NULL DROP TABLE #tmp_Info
IF OBJECT_ID('tempdb..#RN') IS NOT NULL DROP TABLE #RN

CREATE TABLE #tmp_Info
(
RECORD_NO           INT, 
TYPE_1          VARCHAR(10), 
TYPE_2          VARCHAR(250), 
START_END           DATE
)


INSERT INTO #tmp_Info (RECORD_NO, TYPE_1, TYPE_2, START_END)

VALUES
(261505,'IN','ADM','1/1/2001'),
(261505,'OUT','RELEASE','2/6/2001'),
(261505,'IN','ADM','2/10/2001'),
(261505,'OUT','RELEASE','4/2/2001'),
(261505,'IN','ADM','5/12/2001'),
(261505,'OUT','RELEASE','7/13/2001'),
(261506,'IN','ADM','1/12/2001'),
(261506,'OUT','RELEASE','2/15/2001'),
(261506,'IN','ADM','2/20/2001'),
(261506,'OUT','RELEASE','4/2/2001'),
(261506,'IN','ADM','5/15/2001'),
(261506,'OUT','RELEASE','7/17/2001'),
(261506,'IN','ADM','8/1/2001')

SELECT * FROM #tmp_Info;

-->>>> OPTION 1
WITH STARTEND AS
(
SELECT T.RECORD_NO, T.START_END, RN = ROW_NUMBER() OVER (PARTITION BY RECORD_NO, TYPE_1 ORDER BY START_END) 
FROM #tmp_Info T
)
SELECT A.RECORD_NO,A.START_END AS START_DT, B.START_END AS END_DT
FROM STARTEND A
LEFT JOIN STARTEND B ON A.RECORD_NO = B.RECORD_NO AND A.RN = B.RN+1
ORDER BY A.RECORD_NO, A.START_END;

-->>>>OPTION 2

SELECT T.*, RN = ROW_NUMBER() OVER (PARTITION BY RECORD_NO, TYPE_1  ORDER BY START_END)
into #RN 
FROM #tmp_Info T

SELECT * FROM #RN

我正在附加我要查找的结果集:

您可以使用以下查询:

;WITH CTE_Rn AS (
   SELECT RECORD_NO, TYPE_1, TYPE_2, START_END,
          ROW_NUMBER() OVER (PARTITION BY RECORD_NO, TYPE_1 
                             ORDER BY START_END) AS rn
   FROM #tmp_Info
)
SELECT t1.RECORD_NO, t1.START_END AS START_DT, t2.START_END AS END_DT           
FROM CTE_Rn AS t1
LEFT JOIN CTE_Rn AS t2
ON t1.RECORD_NO = t2.RECORD_NO AND    
   t2.TYPE_1 = 'OUT' AND
   t1.rn = t2.rn
WHERE t1.TYPE_1 = 'IN';