将SQL COUNT()结果添加到列值

时间:2013-08-16 21:01:07

标签: tsql cursor sql-update aggregate

我有两个表,Link和Hit。 Hit表包含有关何时触发Link链接的信息。链接表包含一个HitsCount列,其中包含每个链接的命中次数。我们定期将Hit的数据汇总到每小时点击数据的聚合中,并删除聚合数据以节省空间。当我们聚合时,我们还希望将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。我已经考虑过使用LinkId和COUNT()来删除和填充临时表,但我宁愿避免这种情况。另一方面,我也宁愿避免使用CURSOR。

非常感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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