2013-09-25 70 views
1

标题必须令人困惑,但我试图做的事情非常容易通过示例来理解。我有一个表是这样的:如何使用SQL将表中的开始日期更改为一对开始日期和结束日期

Code   Date_   Ratio 

73245 Jan 1 1975 12:00AM 10 
73245 Apr 18 2006 12:00AM 4 
73245 Dec 26 2007 12:00AM 10 
73245 Jan 30 2009 12:00AM 4 
73245 Apr 21 2011 12:00AM 2 

基本上每个安全也给出了它的日期一些比当比例开始生效。该表会容易得多,如果不是仅仅有一个起始日期使用,它有一对开始日期和结束日期,如下所示:

Code    StartDate_   EndDate_    Ratio 
73245  Jan 1 1975 12:00AM Apr 18 2006 12:00AM   10 
73245  Apr 18 2006 12:00AM Dec 26 2007 12:00AM   4 
73245  Dec 26 2007 12:00AM Jan 30 2009 12:00AM   10 
73245  Jan 30 2009 12:00AM Apr 21 2011 12:00AM   4 
73245  Apr 21 2011 12:00AM Dce 31 2049 12:00AM(or some random date in far future)   2 

如何转变原有的表,表我想使用SQL语句?我几乎没有使用SQL的经验,我无法想象如何。

请帮忙!谢谢!

回答

2

在SQL Server 2012:

SELECT code, 
     date_ AS startDate, 
     LEAD(date_) OVER (PARTITION BY code ORDER BY date_) AS endDate, 
     ratio 
FROM mytable 

在SQL Server 2005和2008:

WITH q AS 
     (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY code ORDER BY date_) AS rn 
     FROM mytable 
     ) 
SELECT q1.code, q1.date_ AS startDate, q2.date_ AS endDate, q1.ratio 
FROM q q1 
LEFT JOIN 
     q q2 
ON  q2.code = q1.code 
     AND q2.rn = q1.rn + 1 
+0

像魅力一样工作,谢谢!现在我需要了解它是如何工作的:-) – user2816847

+0

这两个解决方案的工作。第二种解决方案在“q1.code = q1.code”处有一个小错字 – user2816847

0

也许这也有可能使用OUTER APPLY,是这样的:

SELECT t1.Code, t1.Date_ AS StartDate_, ISNULL(t2.EndDate_, CAST('20491231' AS DATETIME)) AS EndDate_ 
FROM t1 AS t1o 
OUTER APPLY 
(
     SELECT TOP 1 Date_ AS EndDate_ 
     FROM t1 
     WHERE t1.Code = t1o.Code AND t1.Date_ > t1o.Date_ 
     ORDER BY t1.Date_ ASC 
) AS t2 
相关问题