当前位置: 首页 > 面试题库 >

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

郁鸿博
2023-03-14
问题内容

可以说我有一个名为“ 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版本中使用。



 类似资料:
  • 问题内容: 如果我有一个具有以下结构和数据的表: 我将使用哪种查询来获得以下结果(随后的说明): 如你看到的: 每个仅返回一行。 最高的那一行是返回的那一行。 是否有一种 无需 使用子查询即可完成此操作的方法?该程序经过的关系代数术语中是否有名称? 问题答案: 该查询称为逐组最大值,它(至少在MySQL中)可以通过子查询实现。例如: 在sqlfiddle上看到它。

  • TL; DR= 我正在尝试调用一个名为“check”的函数,该函数将检查所填写的用户名是否为空,以及我的数据库中是否已经存在该用户名。此检查函数如下所示: 我不知道这段代码是否正常工作,但我想我能做到。问题是我对jQuery缺乏经验。首先,我有一个相当简单的超文本标记语言代码来设置注册页面: 现在,我想在尝试提交表单时使用jQuery来调用它,以便检查用户名是否已经存在。如果没有,则check函数

  • 问题内容: 我在Postgres 9.2中有以下用于用户消息(简化形式)的日志表: 每个用户每天最多包含一条记录。在300天之内,每天大约有50万条记录。每个用户的有效负载都在增加(如果很重要)。 我想有效地检索每个用户在特定日期之前的最新记录。我的查询是: 这非常慢。我也尝试过: 具有相同的计划,并且速度同样慢。 到目前为止,我在上只有一个索引,但并没有太大帮助。 我有一个包含所有用户的表。我还

  • 我们正在开发一个多租户应用程序。在体系结构方面,我们为业务逻辑设计了共享中间层,为数据持久性设计了每个租户一个数据库。也就是说,业务层将与每个租户的数据库服务器建立一组连接(连接池)。这意味着应用程序为每个租户维护单独的连接池。如果我们预计约有5000个租户,那么这个解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们已经通过保持公共连接池解决了这个问

  • 我有一个连接到Sybase ASE的PB应用程序;有没有一种方法可以在应用程序运行时跟踪DB调用。我以前在Oracle10/11G中经常这样做,但在sybase ase中无法理解。如果我能在PB应用程序中运行一个模块并检查之后执行的查询,那将非常有帮助。我使用的是DBVisualizer或RapidSQL。

  • 问题内容: 我有这个数据库结构 我需要的是在特定日期登录的所有用户的列表,例如 我目前正在尝试通过单个SQL查询完成此操作,但是我真的不知道如何获取表中记录的所有时间的时间跨度以及如何将其连接到登录的用户。 我最大的问题是如何创建数据库中所有时间的“虚拟”表… 问题答案: 编辑 CTE的二进制增长,而不是线性增长。2 ^ 100个日期应在合理范围内。