【发布时间】:2014-06-05 02:10:48
【问题描述】:
我有一个包含几百万条记录的表(我们称之为日志)。在我有 Id、Count、FirstHit、LastHit 的字段中。
- Id - 记录 id
- 计数 - 报告此 ID 的次数
- FirstHit - 报告此 ID 的最早时间戳
- LastHit - 报告此 ID 的最新时间戳
对于任何给定的 Id,此表只有一条记录
每天我都会进入另一个表(我们称之为提要),其中包含大约 50 万条记录,其中包含许多其他字段:
- 身份证
- 时间戳 - 输入日期和时间。
这个表可以有很多相同id的记录
我想要做的是通过以下方式更新日志。 Count - 日志计数值,加上在 feed 中找到的该 id 的记录 count() FirstHit - log 中当前值的最早值或 feed 中该 id 的最小值 LastHit - log 中的最新值或 feed 中该 id 的最大值。
需要注意的是,feed 中的很多 id 已经在 log 中了。
简单的方法是创建一个临时表并将两者的并集插入其中
Select Id, Min(Timestamp) As FirstHit, MAX(Timestamp) as LastHit, Count(*) as Count FROM feed GROUP BY Id
UNION ALL
Select Id, FirstHit,LastHit,Count FROM log;
从那个临时表中,我选择聚合 Min(firsthit)、max(lasthit) 和 sum(Count)
Select Id, Min(FirstHit),Max(LastHit),Sum(Count) FROM @temp GROUP BY Id;
这给了我最终的结果。然后我可以从日志中删除所有内容并用 temp 替换它,或者为公共记录制作更新并插入新记录。但是,我认为两者都非常低效。
有没有更有效的方法来做到这一点。也许在日志表中就地进行更新?
【问题讨论】:
-
+ 1 表示好问题和好演示。
标签: sql sql-server database