可以说我有一个名为“ Scrape”的数据库表,可能的设置如下:
UserID (int) UserName (varchar) Wins (int) Losses (int) ScrapeDate (datetime)
我正在尝试根据用户的赢/亏比率对我的用户进行排名。但是,每周我都会在用户上抓取新数据,并在Scrape表中进行另一个输入。
如何查询按赢/亏排序的用户列表,但仅考虑最近的条目(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的过程中,但尚未插入。您还将如何处理这种情况?
所以,我的问题是:
谢谢,也感谢您对我的相关问题给予的答复:
从网页上抓取大量统计信息时,我应该多久将收集的结果插入一次数据库?
这就是我所说的“最大的每组”问题。每周在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行。这就是外部联接的作用, 试图 与s1具有s2相同用户名和更大日期的其他行匹配。如果没有这样的行,则外部联接将为的所有列返回NULL s2,然后我们知道s1对应于该给定用户名具有最大日期的行。
ScrapeDate
s1
s2
当您正在进行部分完成的抓取时,这也应该起作用。
该技术不一定像其他答案给出的CTE和RANKING解决方案一样快。您应该同时尝试这两种方法,然后看看哪种方法更适合您。我之所以喜欢我的解决方案,是因为它可以在任何SQL版本中使用。