如何在sql中查询每个用户的最新记录日期

如何在sql中查询每个用户的最新记录日期,sql,greatest-n-per-group,Sql,Greatest N Per Group,我有一个表,它是关于用户何时登录的集合条目 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.. 如何创建一个查询,为每个用户提供最新的日期 更新:我忘了我需要一个与最新日期一致的

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

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..
如何创建一个查询,为每个用户提供最新的日期


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

您可以使用聚合函数MAX和GROUP BY

SELECT username, MAX(date), value FROM tablename GROUP BY username, value

将解决更新后的问题。即使有很好的索引,它在大型表格上也可能无法很好地工作。

这一条应该为您编辑的问题提供正确的结果

子查询确保只查找最新日期的行,而外部GROUP BY将处理ties。当同一用户的同一日期有两个条目时,它将返回值最高的条目


要获取包含用户最大日期的整行,请执行以下操作:

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

在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

对于Oracle,按降序对结果集进行排序并获取第一条记录,因此您将获得最新的记录:

select * from mytable
where rownum = 1
order by date desc

这也应该起作用,以便为用户获取所有最新条目

SELECT username, MAX(date) as Date, value
FROM MyTable
GROUP BY username, value

我看到大多数开发人员使用内联查询时没有考虑它对海量数据的影响

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

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;
从表1中选择*其中lastest\u date=从表1中选择Maxlatest\u date,其中user=您的用户名


内部查询将返回当前用户的最新日期,外部查询将根据内部查询结果提取所有数据。

我使用这种方法获取表中每个用户的最后一条记录。 这是一个查询,根据PDA设备上检测到的最近时间,获取销售人员的最后位置

CREATE FUNCTION dbo.UsersLocation()
RETURNS TABLE
AS
RETURN
Select GS.UserID, MAX(GS.UTCDateTime) 'LastDate'
From USERGPS GS
where year(GS.UTCDateTime) = YEAR(GETDATE()) 
Group By GS.UserID
GO
select  gs.UserID, sl.LastDate, gs.Latitude , gs.Longitude
        from USERGPS gs
        inner join USER s on gs.SalesManNo = s.SalesmanNo 
        inner join dbo.UsersLocation() sl on gs.UserID= sl.UserID and gs.UTCDateTime = sl.LastDate 
        order by LastDate desc
我的小汇编

自连接优于嵌套选择 但是GROUPBY不会给您主键,这对于join来说是更可取的 此键可以通过分区by与第一个_值一起给出 因此,这里有一个问题:

select t.* from Table t inner join ( select distinct first_value(ID) over(partition by GroupColumn order by DateColumn desc) as ID from Table where FilterColumn = 'value' ) j on t.ID = j.ID 优点:

使用任何列使用where语句筛选数据 从筛选的行中选择任意列 缺点:

从2012年开始需要MS SQL Server。
我为我的申请做了一些准备,因为:

以下是查询:

select distinct i.userId,i.statusCheck, l.userName from internetstatus 
as i inner join login as l on i.userID=l.userID 
where nowtime in((select max(nowtime) from InternetStatus group by userID));    

这类似于上面的一个答案,但在我看来,它更简单、更整洁。此外,还显示了交叉应用语句的良好用途。对于SQL Server 2005及更高版本

select
    a.username,
    a.date,
    a.value,
from yourtable a
cross apply (select max(date) 'maxdate' from yourtable a1 where a.username=a1.username) b
where a.date=b.maxdate

根据我的经验,最快的方法是获取表中没有较新行的每一行

另一个优点是所使用的语法非常简单,而且查询的含义很容易理解,因为所有行中都没有新的行用于所考虑的用户名

不存在 行号 内连接 左外连接
也可以使用分析秩函数

    with temp as 
(
select username, date, RANK() over (partition by username order by date desc) as rnk from t
)
select username, rnk from t where rnk = 1


你在使用什么数据库?MySQL、SQL Server、Oracle等等?您需要与最新日期一起使用的值,还是最大值和最大日期?编辑的可能副本将只选择一个随机值,而不是与MAXdate行关联的值。它将给出最大日期,但用户名和值可能不属于同一记录。虽然这是另一种可能的解决方案,这通常不是解决这个问题的好方法。这样做将导致对表中的每个名称运行一次内部查询,从而导致任何较大的表的速度大大降低。在where子句的第一个查询中执行一个没有元素的单独查询,然后将两个表连接起来通常会更快。这确实有一个很好的特点,即它是一个更容易理解的解决方案,而不是特定于实现的解决方案。使用postgresql时,这个版本会比使用in更快吗子查询而不是内部联接?@TheOne根据我的经验,使用内部联接比使用Condition更快仔细考虑这种方法:如果每个用户每个日期有多条记录,则它可以为每个用户返回多行maxdate将返回一个将联接多条记录的日期。为了避免这个问题,最好使用@dotjoe的解决方案:。@RedFilter这个方法非常适合我的问题。非常感谢您的技术咨询。顺便说一句,我使用datetime而不是date来避免获得特定日期的多个结果。为什么您需要'and t.date=tm.MaxDate'分组还不够?一两句关于实现或解释的话对创建高质量的答案有很大帮助。如果多个用户在同一日期有订单,这可能不起作用;如果brad和bob在1月2日都有订单呢?我按用户名分组,结果如下:用户名日期值bob 2010-02-02 1.2 brad 2010-02-02 1.4 fred 2010-01-03 1.0Hi,值列需要位于group by子句中。为MySQL工作时,请注意,如果有多个特定用户的记录具有相同的日期,则这将为您提供重复记录。您可能需要,也可能不需要。此sql在Oracle和cla中运行缓慢
使用时,它不会使用indexWelcome to StackOverflow,并感谢您的帮助。与解释解决方案的答案相比,像您这样的纯代码答案不太受欢迎。请阅读此文章以提供高质量的答案。和。它不会为每个用户名返回最大值,只返回最新的一行。实际上,这只适用于重复的用户名。如果您有两个以上的值,则条件a.datet.date和witness.username=t.username;我已经查看了notexists,它看起来只返回所有用户的更高条目,而不是:一个将为每个用户提供最新日期的查询。你说得对,我更新了我的查询。谢谢你的评论@Narsher很抱歉,由于某些原因,我错过了你的评论:/但是你是绝对正确的。虽然这段代码可能会解决这个问题,但如何以及为什么解决这个问题将真正有助于提高你的文章质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
SELECT username, MAX(date) as Date, value
FROM MyTable
GROUP BY username, value
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;
CREATE FUNCTION dbo.UsersLocation()
RETURNS TABLE
AS
RETURN
Select GS.UserID, MAX(GS.UTCDateTime) 'LastDate'
From USERGPS GS
where year(GS.UTCDateTime) = YEAR(GETDATE()) 
Group By GS.UserID
GO
select  gs.UserID, sl.LastDate, gs.Latitude , gs.Longitude
        from USERGPS gs
        inner join USER s on gs.SalesManNo = s.SalesmanNo 
        inner join dbo.UsersLocation() sl on gs.UserID= sl.UserID and gs.UTCDateTime = sl.LastDate 
        order by LastDate desc
SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)
select t.* from Table t inner join ( select distinct first_value(ID) over(partition by GroupColumn order by DateColumn desc) as ID from Table where FilterColumn = 'value' ) j on t.ID = j.ID
select distinct i.userId,i.statusCheck, l.userName from internetstatus 
as i inner join login as l on i.userID=l.userID 
where nowtime in((select max(nowtime) from InternetStatus group by userID));    
select
    a.username,
    a.date,
    a.value,
from yourtable a
cross apply (select max(date) 'maxdate' from yourtable a1 where a.username=a1.username) b
where a.date=b.maxdate
SELECT username, value
FROM t
WHERE NOT EXISTS (
  SELECT *
  FROM t AS witness
  WHERE witness.username = t.username AND witness.date > t.date
);
SELECT username, value
FROM (
  SELECT username, value, row_number() OVER (PARTITION BY username ORDER BY date DESC) AS rn
  FROM t
) t2
WHERE rn = 1
SELECT t.username, t.value
FROM t
INNER JOIN (
  SELECT username, MAX(date) AS date
  FROM t
  GROUP BY username
) tm ON t.username = tm.username AND t.date = tm.date;
SELECT username, value
FROM t
LEFT OUTER JOIN t AS w ON t.username = w.username AND t.date < w.date
WHERE w.username IS NULL
    with temp as 
(
select username, date, RANK() over (partition by username order by date desc) as rnk from t
)
select username, rnk from t where rnk = 1
SELECT MAX(DATE) AS dates 
FROM assignment  
JOIN paper_submission_detail ON  assignment.PAPER_SUB_ID = 
     paper_submission_detail.PAPER_SUB_ID