如何查询数据库中用户的排名,但仅考虑每个用户的最新条目?

可以说我有一个名为“ 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. 您将如何处理仅查询每个用户的最新拼版以确定排名
  2. 您是否认为数据库可能处于更新状态(尤其是刮擦可能需要最多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行。这就是外部联接的作用, 试图

s1具有s2相同用户名和更大日期的其他行匹配。如果没有这样的行,则外部联接将为的所有列返回NULL

s2,然后我们知道s1对应于该给定用户名具有最大日期的行。

当您正在进行部分完成的抓取时,这也应该起作用。

该技术不一定像其他答案给出的CTE和RANKING解决方案一样快。您应该同时尝试这两种方法,然后看看哪种方法更适合您。我之所以喜欢我的解决方案,是因为它可以在任何SQL版本中使用。

以上是 如何查询数据库中用户的排名,但仅考虑每个用户的最新条目? 的全部内容, 来源链接: utcz.com/qa/402498.html

回到顶部