1

リンクとヒットの 2 つのテーブルがあります。Hit テーブルには、Link からのリンクがいつヒットしたかに関する情報が含まれています。Link テーブルには、各リンクがヒットした回数を示す列 HitsCount が含まれています。定期的にヒットのデータを 1 時間ごとのヒット データの集計に集計し、集計されたデータを削除してスペースを節約します。集計するときに、Link.HitsCount を、集計している現在の時間のリンクの COUNT() で更新することも必要です。これはどのように行われますか?

T-SQLを使用した私の現在の試みは次のとおりです。

DECLARE cc CURSOR LOCAL FOR
    SELECT COUNT(*) AS c, h.LinkId AS id
    FROM   Hit AS h
    WHERE  h.[Timestamp] >= @p_startTime AND h.[Timestamp] < @p_endHour
    GROUP BY h.LinkId

OPEN cc
FETCH cc

UPDATELink
SET Link.HitsCount = HitsCount + c
FROM Link
WHERE CURRENT OF cc

CLOSE cc
DEALLOCATE cc

ただし、「列名 'c' が無効です」というエラーが表示されます。また、このアプローチは、本来のように h.LinkId と Link.LinkId で JOIN しません。スクラッチ テーブルに LinkId と COUNT() をドロップして入力することを考えましたが、これは避けたいと思います。一方で、CURSOR も避けたいと思います。

どうもありがとう。
ネイサン

4

2 に答える 2

3

カーソルは必要ありません。次のようにする必要があります

UPDATE Link
SET HitsCount = HitsCount + (SELECT COUNT(1) FROM Hit 
                             WHERE Hit.LinkId = Link.Id
                             AND Hit.[Timestamp] >= @p_startTime 
                             AND Hit.[Timestamp] < @p_endHour)

また

;WITH Hits AS
(
    SELECT COUNT(1) AS freq, h.LinkId
    FROM   Hit AS h
    WHERE  h.[Timestamp] >= @p_startTime AND h.[Timestamp] < @p_endHour
    GROUP BY h.LinkId
)

UPDATE l
SET l.HitCount = l.HitCount + h.freq
FROM Link l
JOIN Hits h ON h.LinkId = l.Id
于 2013-08-16T21:15:06.647 に答える
1

サブクエリで JOIN を使用します。

UPDATE Link l
JOIN (SELECT LinkId, COUNT(*) HitsCount
      FROM Hit
      WHERE h.[Timestamp] >= @p_startTime AND h.[Timestamp] < @p_endHour
      GROUP BY LinkID) h
USING (LinkId)
SET l.HitsCount = l.HitsCount + h.HitsCount
于 2013-08-16T21:19:09.937 に答える