如何使用SQL将表中的开始日期更改为一对开始日期和结束日期
标题一定很混乱,但我想做的事情很容易理解,举个例子。我有一张这样的桌子:如何使用SQL将表中的开始日期更改为一对开始日期和结束日期,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,标题一定很混乱,但我想做的事情很容易理解,举个例子。我有一张这样的桌子: 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 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几乎没有经验,也不知道如何使用
请帮忙!谢谢 在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
也许也可以使用外部应用,例如:
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
很有魅力,谢谢!现在我需要了解它是如何工作的:-)两种解决方案都有效。第二个解决方案在“q1.code=q1.code”处有一个小的输入错误