1

我有两个表,链接和命中。Hit 表包含有关来自 Link 的链接何时被点击的信息。Link 表包含一个 HitsCount 列,其中包含每个链接被点击的次数。我们定期将 Hit 的数据汇总为每小时点击的数据聚合,并删除聚合数据以节省空间。当我们聚合时,我们还想用我们正在聚合的当前小时的链接的 COUNT() 更新 Link.HitsCount。这是怎么做到的?

这是我目前的尝试,使用 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 。我曾考虑使用 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 回答