Tsql 表子集的T-SQL平均
我在SQL Server 2005中有一个针对单个位置的每日天气数据表,其中包括以下列:Tsql 表子集的T-SQL平均,tsql,sql-server-2005,Tsql,Sql Server 2005,我在SQL Server 2005中有一个针对单个位置的每日天气数据表,其中包括以下列: LogDate DATETIME HighTemp INT Temp6MonthHighAverage INT LogDate和HighTemp有数据。顾名思义,HighTemp6MonthAverage将填充以LogDate结束的6个月内的平均高温 对于跨越数十年的数据,对低温、湿度和其他几个项目也有类似的要求 我发现自己在兜
LogDate DATETIME
HighTemp INT
Temp6MonthHighAverage INT
LogDate和HighTemp有数据。顾名思义,HighTemp6MonthAverage将填充以LogDate结束的6个月内的平均高温
对于跨越数十年的数据,对低温、湿度和其他几个项目也有类似的要求
我发现自己在兜圈子。我可以使用set操作为UPDATE语句中的每一行导出此平均值,还是需要使用游标实现解决方案?如果有任何建议,我将不胜感激。看看这样的建议
DECLARE @Table TABLE(
LogDate DATETIME,
HighTemp INT,
Temp6MonthHighAverage INT
)
INSERT INTO @Table SELECT '01 Jan 2000', 15, NULL
INSERT INTO @Table SELECT '01 May 2000', 14, NULL
INSERT INTO @Table SELECT '01 Jun 2000', 13, NULL
INSERT INTO @Table SELECT '01 Jul 2000', 12, NULL
INSERT INTO @Table SELECT '01 Dec 2000', 17, NULL
SELECT *
FROM @Table
;WITH DistinctDates AS (
SELECT DATEADD(month,-6,LogDate) StartDate,
LogDate EndDate,
HighTemp
FROM @Table
)
, Aggregates AS (
SELECT dd.EndDate LogDate,
dd.HighTemp,
MAX(t.HighTemp) Temp6MonthHighAverage
FROM DistinctDates dd LEFT JOIN
@Table t ON t.LogDate BETWEEN dd.StartDate AND dd.EndDate
GROUP BY dd.EndDate,
dd.HighTemp
)
UPDATE @Table
SET Temp6MonthHighAverage = a.Temp6MonthHighAverage
FROM @Table t INNER JOIN
Aggregates a ON t.LogDate = a.LogDate
SELECT *
FROM @Table
看看这样的东西
DECLARE @Table TABLE(
LogDate DATETIME,
HighTemp INT,
Temp6MonthHighAverage INT
)
INSERT INTO @Table SELECT '01 Jan 2000', 15, NULL
INSERT INTO @Table SELECT '01 May 2000', 14, NULL
INSERT INTO @Table SELECT '01 Jun 2000', 13, NULL
INSERT INTO @Table SELECT '01 Jul 2000', 12, NULL
INSERT INTO @Table SELECT '01 Dec 2000', 17, NULL
SELECT *
FROM @Table
;WITH DistinctDates AS (
SELECT DATEADD(month,-6,LogDate) StartDate,
LogDate EndDate,
HighTemp
FROM @Table
)
, Aggregates AS (
SELECT dd.EndDate LogDate,
dd.HighTemp,
MAX(t.HighTemp) Temp6MonthHighAverage
FROM DistinctDates dd LEFT JOIN
@Table t ON t.LogDate BETWEEN dd.StartDate AND dd.EndDate
GROUP BY dd.EndDate,
dd.HighTemp
)
UPDATE @Table
SET Temp6MonthHighAverage = a.Temp6MonthHighAverage
FROM @Table t INNER JOIN
Aggregates a ON t.LogDate = a.LogDate
SELECT *
FROM @Table
您当然可以通过简单的更新来做到这一点:
UPDATE table SET Temp6MonthHighAverage =
(SELECT AVG(HighTemp) FROM table t2 WHERE
t2.LogDate <= table.LogDate
AND t2.LogDate > DATEADD(m, -6, table.LogDate)
)
由于过去不会改变,为了避免不断地重新计算,只需添加一个Temp6MonthHighAverage在结尾处为空的值,并且可以根据需要运行相同的更新,以在添加新日期时填补空白。您当然可以通过简单的更新来完成此操作:
UPDATE table SET Temp6MonthHighAverage =
(SELECT AVG(HighTemp) FROM table t2 WHERE
t2.LogDate <= table.LogDate
AND t2.LogDate > DATEADD(m, -6, table.LogDate)
)
-- select
select HighTemp, LogDate,(select AVG(HighTemp)
from tbl where
DATEDIFF(MONTH, LogDate, t1.LogDate) between 0 and 6)
from tbl t1
-- update
update t1 set Temp6MonthHighAverage = (select AVG(HighTemp)
from tbl where
DATEDIFF(MONTH, LogDate, t1.LogDate) between 0 and 6)
from tbl t1
由于过去不会改变,为了避免不断地重新计算,只需添加一个Temp6MonthHighAverage在结尾处为空,并且可以根据需要运行相同的更新,以在添加新日期时填补空白。您可以使用UPDATE语句来完成此操作,但我怀疑使用游标可能更有效,因为SQL Server可能无法实现滚动平均。请选择SQL Server的哪个版本?您可以使用UPDATE语句来实现,但我怀疑使用游标可能更有效,因为SQL Server可能无法实现滚动平均。请选择哪个版本的SQL Server?
-- select
select HighTemp, LogDate,(select AVG(HighTemp)
from tbl where
DATEDIFF(MONTH, LogDate, t1.LogDate) between 0 and 6)
from tbl t1
-- update
update t1 set Temp6MonthHighAverage = (select AVG(HighTemp)
from tbl where
DATEDIFF(MONTH, LogDate, t1.LogDate) between 0 and 6)
from tbl t1