假设我有一个名为“Scrape”的数据库表,可能设置如下:
UserID (int)
UserName (varchar)
Wins (int)
Losses (int)
ScrapeDate (datetime)
我试图根据用户的赢/输比对他们进行排名。但是,每周我都会抓取有关用户的新数据,并在抓取表中添加另一个条目。
如何查询按赢/输排序的用户列表,但只考虑最近的条目 (ScrapeDate)?
另外,您认为人们会访问该网站并且刮擦可能正在完成中这很重要吗?
例如我可以有:
1 - Bob - Wins: 320 - Losses: 110 - ScrapeDate: 7/8/09
1 - Bob - Wins: 360 - Losses: 122 - ScrapeDate: 7/17/09
2 - Frank - Wins: 115 - Losses: 20 - ScrapeDate: 7/8/09
其中,这表示到目前为止仅更新了 Bob 的抓取,并且正在更新 Frank 但尚未插入。您也将如何处理这种情况?
所以,我的问题是:
- 您将如何处理仅查询每个用户的最新抓取以确定排名
- 您认为数据库可能处于更新状态(特别是如果抓取可能需要长达 1 天才能完成)并且并非所有用户都已完全更新这一事实很重要吗?如果是这样,你会如何处理?
谢谢您,也感谢您就我的相关问题给我的答复:
当从网页上抓取大量统计信息时,我应该多久将收集到的结果插入到数据库中?
这就是我所说的“每组最大的”问题。它每周在 StackOverflow 上出现几次。
我使用外连接技术解决此类问题:
SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;
这将为每个用户名仅返回一行 - 中具有最大值的行ScrapeDate
柱子。这就是外连接的用途,try匹配s1
与其他一些行s2
使用相同的用户名和更大的日期。如果没有这样的行,则外连接对所有列都返回 NULLs2
,然后我们知道s1
对应于给定用户名的最大日期的行。
当您正在进行部分完成的抓取时,这也应该有效。
这种技术不一定像其他答案给出的 CTE 和 RANKING 解决方案那么快。您应该两者都尝试一下,看看哪种更适合您。我更喜欢我的解决方案的原因是它适用于任何 SQL 风格。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)