如何查询数据库中用户的排名,但仅考虑每个用户的最新条目?
可以说我有一个名为“ 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的过程中,但尚未插入。您还将如何处理这种情况?
所以,我的问题是:
- 您将如何处理仅查询每个用户的最新拼版以确定排名
- 您是否认为数据库可能处于更新状态(尤其是刮擦可能需要最多1天的时间才能完成),而且并非所有用户都已完全更新仍然重要吗?如果是这样,您将如何处理?
谢谢,也感谢您对我的相关问题给予的答复:
从网页上抓取大量统计信息时,我应该多久将收集的结果插入一次数据库?
回答:
这就是我所说的“最大的每组”问题。每周在StackOverflow上出现几次。
我使用外部联接技术解决了这类问题:
SELECT s1.*, s1.wins / s1.losses AS win_loss_ratioFROM 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
对应于该给定用户名具有最大日期的行。
当您正在进行部分完成的抓取时,这也应该起作用。
该技术不一定像其他答案给出的CTE和RANKING解决方案一样快。您应该同时尝试这两种方法,然后看看哪种方法更适合您。我之所以喜欢我的解决方案,是因为它可以在任何SQL版本中使用。
以上是 如何查询数据库中用户的排名,但仅考虑每个用户的最新条目? 的全部内容, 来源链接: utcz.com/qa/402498.html