1

次の列を含む単一の場所の毎日の気象データのテーブル(SQL Server 2005)があります。

LogDate                 DATETIME  
HighTemp                INT  
Temp6MonthHighAverage   INT  

LogDateHighTempデータがあります。HighTemp6MonthAverage名前が示すように、で終わる6か月間の平均最高気温が表示されLogDateます。

数十年にわたるデータについては、LowTempだけでなく、湿度やその他のいくつかの項目にも同様の要件があります。

私は自分が輪になって考えていることに気づきます。set操作を使用してUPDATEステートメントの各行のこの平均を導出できますか、それともカーソルを使用してソリューションを実装する必要がありますか?何か提案をいただければ幸いです。

4

3 に答える 3

3
-- 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
于 2012-08-27T04:25:16.570 に答える
1

あなたは確かに簡単な更新でこれを行うことができます:

UPDATE table SET Temp6MonthHighAverage = 
  (SELECT AVG(HighTemp) FROM table t2 WHERE
     t2.LogDate <= table.LogDate
     AND t2.LogDate > DATEADD(m, -6, table.LogDate)
  )

常に再計算されないようにするには(過去は変更されないため)、WHERE Temp6MonthHighAverage IS NULL最後にを追加するだけで、必要に応じて同じUPDATEを実行して、新しい日付が追加されたときにギャップを埋めることができます。

于 2012-08-27T04:18:08.120 に答える
0

このようなものを見てください

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
于 2012-08-27T04:12:48.040 に答える