我有一个表,它是用户登录时的集合条目 .
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
如何创建一个可以为每个用户提供最新日期的查询?
Update: 我忘记了我需要一个与最新日期一致的值 .
21 回答
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
内部查询将返回当前用户的最新日期,外部查询将根据内部查询结果提取所有数据 .
将解决更新的问题 . 即使具有良好的索引,它在大型表上也可能无法正常工作 .
使用窗口函数(适用于Oracle,Postgres 8.4,SQL Server 2005,DB2,Sybase,Firebird 3.0,MariaDB 10.3)
我看到大多数开发人员使用内联查询而不考虑它对大数据的影响 .
简单地说,你可以通过以下方式实现
要获取包含用户最大日期的整行:
这个应该为您编辑的问题提供正确的结果 .
子查询确保只查找最新日期的行,而外部
GROUP BY
将处理关系 . 当同一用户的同一日期有两个条目时,它将返回具有最高value
的条目 .对于Oracle按降序对结果集进行排序并获取第一条记录,因此您将获得最新记录:
我用这种方式为我桌上的每个用户记录最后一条记录 . 这是根据PDA设备上检测到的最近时间获取销售员的最后位置的查询 .
我的小编辑
self
join
比嵌套好select
但
group by
没有给你primary key
这是join
的首选此键可以由
partition by
与first_value
(docs)一起提供所以,这是一个查询:
优点:
使用任何列使用
where
语句过滤数据select
过滤行中的任何列缺点:
我做了一些我的应用程序:
以下是查询:
根据我的经验,最快的方法是获取表中没有新行的每一行 . 这里有一些基准,我手边有一些数据 .
另一个优点是使用的语法非常简单,并且查询的含义相当容易掌握(占用所有行,以便不考虑用户名的新行) .
NOT EXISTS
解释总费用:2.38136
ROW_NUMBER
总费用:61.5823
INNER JOIN
解释总费用:67.5439
LEFT OUTER JOIN
解释总费用:62.964
解释计划来自一个大约有10k行的数据库,存储为XML . 使用的查询还包含谓词“group_id ='1'” .
这类似于上面的答案之一,但在我看来,它更简单,更整洁 . 此外,显示了交叉应用语句的良好用途 . 对于SQL Server 2005及更高版本...
您还可以使用分析秩功能
您将使用聚合函数MAX和GROUP BY
这也应该用于获取用户的所有最新条目 .