我有两个表,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。
非常感谢。
森
答案 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