user2816847
user2816847

Reputation: 13

How to change start date in a table to a pair of start date and end date using SQL

The title must be confusing, but the thing I am trying to do is very easy to understand with an example. I have a table like this:

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

Basically for each security it gives some ratio for it with a date when the ratio starts to be effective. This table will be much easier to use if instead of just having a start date, it has a pair of start date and end date, like the following:

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

How do I transform the original table to the table I want using SQL statements? I have little experience with SQL and I could not figure how.

Please help! Thanks!

Upvotes: 1

Views: 114

Answers (2)

Quassnoi
Quassnoi

Reputation: 425371

In SQL Server 2012:

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

In SQL Server 2005 and 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

Upvotes: 2

blueling
blueling

Reputation: 2013

Maybe it would also be possible to use OUTER APPLY, something like:

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

Upvotes: 0

Related Questions