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

SQLite:如何从带有组合键的单个表中选择“每个用户的最新记录”?

闽高峯
2023-03-14
问题内容

我不是数据库专家,感觉好像缺少一些核心SQL知识来寻求该问题的解决方案。这是我可以解释的简短情况。

语境:

我有一个包含时间戳的用户事件记录的SQLite数据库表。可以通过时间戳和用户ID(即事件发生的时间以及事件的发生者)的组合来唯一地标识记录。我了解这种情况称为“复合主键”。该表看起来像这样(当然,删除了许多其他列):

sqlite> select Last_Updated,User_ID from records limit 4;

Last_Updated   User_ID
-------------  --------
1434003858430  1   
1433882146115  3   
1433882837088  3   
1433964103500  2

问题: 我如何SELECT只包含 每个 用户的 最新 记录的结果集? __

给定上面的示例,我想找回的是一个看起来像这样的表:

Last_Updated   User_ID
-------------  --------
1434003858430  1   
1433882837088  3   
1433964103500  2

(请注意,结果集仅包含用户3的最新记录。)

实际上,此表中大约有250万行。

奖励:
我一直在阅读有关JOIN,重复数据删除程序等的答案,并且我一直在搜索教程/文章,希望自己能找到我所缺少的东西。我有广泛的编程背景,因此我可以像以前做过一百次一样,以过程代码形式将此数据集重复数据删除,但是我厌倦了编写脚本来执行我认为在SQL中应该做的事情。这就是它的目的,对不对?

因此,从概念上讲,我认为从我对SQL的理解中缺少什么,以便理解您为问题提供的解决方案为何真正起作用?(只要引用一篇很好的文章,实际上可以解释该实践背后的理论就足够了。)我想知道为什么该解决方案真正有效,而不仅仅是它确实起作用。

非常感谢您的宝贵时间!


问题答案:

您可以尝试以下方法:

select user_id, max(last_updated) as latest
from records
group by user_id

这应该为您提供每个用户的最新记录。我假设您有一个结合了user_id和last_updated的索引。

一般来说,在上述查询中,我们正在要求数据库对user_id记录进行分组。如果user_id
1的记录多于1条,则它们将全部分组在一起。从该记录集中,将选择最大的last_updated作为输出。然后,寻找下一个组,并在此应用相同的操作。

如果您有一个复合索引,sqlite可能会只使用该索引,因为该索引包含查询中要处理的两个字段。索引小于表本身,因此扫描或查找速度更快。



 类似资料:
  • 问题内容: 我有一个得分表,其中有球员得分,并且我想为每个得分最高的球员选择唯一的记录。 表格如下: 预期结果: 我可以这样用纯SQL来实现: 您能告诉我如何使用查询dsl实现相同的查询吗?我找到了一些使用JPASubQuery的解决方案,但该类对我不起作用(我的IDE无法解析该类)。我正在使用querydsl4.x。先感谢您。 问题答案: 已在querydsl 4中删除。请改为使用。您的子句应如

  • 问题内容: 我在通过实体框架查询访问的数据库中有一个设置表。这些设置具有复合键:类别,组,名称,目标,已修改。这些设置显然还包含诸如值之类的非关键字段。 我将如何编写查询以提供相同设置(类别,组,名称,目标)中的最新设置? 更具体地说,我希望所有最新的设置实体(包括非关键字段)都与特定的类别,组,目标组合匹配。 例如:为我提供所有目标的所有最新设置,其中“类别”是“数据库”,而“组”是“超时”。

  • 问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的

  • 如何选择每个学生最喜欢的学期链接图片。 http://i.stack.imgur.com/Ka97X.jpg

  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。

  • 问题内容: 我有一个项目数据库。每个项目都按类别表中的类别ID进行分类。我正在尝试创建一个列出每个类别的页面,并在每个类别下方显示该类别中的4个最新项目。 例如: 宠物用品 宠物食品 我知道我可以通过查询数据库来轻松解决此问题,如下所示: 然后遍历该数据并查询数据库中的每个类别以获取最新的项目: 我要弄清楚的是,我是否可以仅使用1个查询并获取所有这些数据。我有33个类别,因此我认为这可能有助于减少