当前位置:  开发笔记 > 数据库 > 正文

如何查询sql以获取每个用户的最新记录日期

如何解决《如何查询sql以获取每个用户的最新记录日期》经验,为你挑选了5个好方法。

我有一个表,它是用户登录时的集合条目.

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..

如何创建一个可以为每个用户提供最新日期的查询?

更新:我忘了我需要一个与最新日期一致的值.



1> RedFilter..:
select t.username, t.date, t.value
from MyTable t
inner join (
    select username, max(date) as MaxDate
    from MyTable
    group by username
) tm on t.username = tm.username and t.date = tm.MaxDate


谨慎使用这种方法:如果每个用户有多个记录,则每个用户可以返回多行(“ max(date)”将返回将多个记录连接在一起的日期)。为避免此问题,最好使用@dotjoe的解决方案:/sf/ask/17360801/。
使用postgresql时,这个版本会比使用IN(子查询)而不是内连接更快吗?
@TheOne作为我的经验,使用内连接比在条件下更快

2> dotjoe..:

使用窗口函数(适用于Oracle,Postgres 8.4,SQL Server 2005,DB2,Sybase,Firebird 3.0,MariaDB 10.3)

select * from (
    select
        username,
        date,
        value,
        row_number() over(partition by username order by date desc) as rn
    from
        yourtable
) t
where t.rn = 1



3> 小智..:

我看到大多数开发人员使用内联查询而不考虑它对大数据的影响.

简单地说,您可以通过以下方式实现

SELECT a.username, a.date, a.value
FROM myTable a
LEFT OUTER JOIN myTable b
ON a.username = b.username 
AND a.date < b.date
WHERE b.username IS NULL
ORDER BY a.date desc;


实际上,这仅适用于重复项,如果您有两个以上的值,则条件a.date <b.date不起作用,这意味着这不是一般的解决方案,尽管使用LEFT OUTER JOIN的想法很重要这个答案中的东西。

4> Alison R...:

要获取包含用户最大日期的整行:

select username, date, value
from tablename where (username, date) in (
    select username, max(date) as date
    from tablename
    group by username
)


这适用于Oracle,但不适用于SQL Server.

5> 小智..:
SELECT *     
FROM MyTable T1    
WHERE date = (
   SELECT max(date)
   FROM MyTable T2
   WHERE T1.username=T2.username
)


虽然这是另一种可能的解决方案,但这通常不是解决此问题的好方法.这样做会导致内部查询对表中的每个名称运行一次,导致任何有效大小的表的主要减速.执行一个单独的查询,该查询没有来自where子句中第一个查询的元素,然后将两个表连接起来*通常*会更快.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有