TSQL-将每行的值添加到下一行
我有两列,我想将每一行的值(小时)添加到下一行TSQL-将每行的值添加到下一行,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我有两列,我想将每一行的值(小时)添加到下一行 Date Hour 2014-01-13 13:00 0 2014-01-13 14:00 3 2014-01-13 16:00 2 我想有一个新的日期列,显示如下: Date Hour **New_Date** 2014-01-13 13:00 0 2014-01-13 16:00 2014-01-13 14:00 3
Date Hour
2014-01-13 13:00 0
2014-01-13 14:00 3
2014-01-13 16:00 2
我想有一个新的日期列,显示如下:
Date Hour **New_Date**
2014-01-13 13:00 0 2014-01-13 16:00
2014-01-13 14:00 3 2014-01-13 17:00
2014-01-13 16:00 2 2014-01-13 18:00
您可以将子查询与
DATEADD
一起使用:
SELECT [Date], [Hour],
DATEADD(hour, (SELECT TOP 1 t2.[Hour]
FROM dbo.Tablename t2
WHERE t2.[Date] > t1.[Date]
ORDER BY t2.[Date]), [Date])
AS [New_Date]
FROM dbo.TableName t1
ORDER BY [Date]
但正如你在第二行看到的那样,由于这是第三行的小时,所以增加了两个小时。此外,最后一行没有新日期,因为没有下一行。您想要的结果是否有误?试试这个
CREATE TABLE #temp
(
[Date] DATETIME,
[Hour] INT
)
INSERT INTO #temp
([Date],[Hour])
VALUES ('2014-01-13 13:00:00',0),
('2014-01-13 14:00:00',3),
('2014-01-13 16:00:00',2)
;WITH cte
AS (SELECT Row_number()
OVER(
ORDER BY [date]) AS id,
*
FROM #temp)
SELECT a.Date,
a.Hour,
Dateadd(hh, a.Hour, CASE
WHEN a.id != 1 THEN a.[date]
ELSE (SELECT TOP 1 date
FROM cte
ORDER BY id DESC)
END) newdate
FROM cte a
LEFT JOIN cte b
ON a.id = b.id + 1
输出
Date Hour newdate
2014-01-13 13:00:00.000 0 2014-01-13 16:00:00.000
2014-01-13 14:00:00.000 3 2014-01-13 17:00:00.000
2014-01-13 16:00:00.000 2 2014-01-13 18:00:00.000
您很可能可以使用运行总计和DATEADD来执行您在此处尝试执行的操作。如何计算运行总计将取决于您使用的sql server版本。2012年和2014年有超前和滞后函数,这使得这非常简单。2008年及更早的时候更具挑战性。搜索running total,你会发现很多例子。