小编典典

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

sql

可以说我有一个名为“ 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天的时间才能完成),而且并非所有用户都已完全更新仍然重要吗?如果是这样,您将如何处理?

谢谢,也感谢您对我的相关问题给予的答复:

从网页上抓取大量统计信息时,我应该多久将收集的结果插入一次数据库?


阅读 387

收藏
2021-04-07

共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版本中使用。

2021-04-07