我有一个表,其中包含有关用户登录时间的集合条目。

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

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

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

有帮助吗?

解决方案

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

其他提示

使用窗口函数(在Oracle,Postgres的8.4,SQL Server 2005的,DB2中,Sybase,火鸟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

我看到大部分的开发使用嵌入式查询,而不考虑其对海量数据的影响。

简单地说,可以通过实现这一点:

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;

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

select username, date, value
from tablename where (username, date) in (
    select username, max(date) as date
    from tablename
    group by username
)
SELECT *     
FROM MyTable T1    
WHERE date = (
   SELECT max(date)
   FROM MyTable T2
   WHERE T1.username=T2.username
)

从我的经验,最快的方法是采取其中有表中没有新行的每一行。下面是一些数据我手边一点基准。

另一个优点是,所使用的语法是很简单的,并且该查询的意义是相当容易掌握(采取所有的行,使得没有更新的行存在的用户名被考虑)。

NOT EXISTS

SELECT username, value
FROM t
WHERE NOT EXISTS (
  SELECT *
  FROM t AS witness
  WHERE witness.date > t.date
);

解释总成本:2.38136

ROW_NUMBER

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

总成本:61.5823

INNER JOIN

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;

解释总成本:67.5439

LEFT OUTER JOIN

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

解释总成本:62.964


在解释计划来自用约10K行的数据库,存储为XML。还使用的查询包含谓词 “GROUP_ID = '1'”。

这应该给你正确的结果为您编辑的问题。

在子查询可确保找到最新的日期仅排,外GROUP BY将关系照顾。当有在同一日期为同一用户的两个条目,它将返回一个具有最高value

SELECT t.username, t.date, MAX( t.value ) value
FROM your_table t
JOIN (
       SELECT username, MAX( date ) date
       FROM your_table
       GROUP BY username
) x ON ( x.username = t.username AND x.date = t.date )
GROUP BY t.username, t.date

您也可以使用分析秩函数

    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 Username, date, value
 from MyTable mt
 inner join (select username, max(date) date
              from MyTable
              group by username) sub
  on sub.username = mt.username
   and sub.date = mt.date

将解决更新问题。它可能不是大表上工作这么好,即使有良好的索引。

SELECT *
FROM ReportStatus c
inner join ( SELECT 
  MAX(Date) AS MaxDate
  FROM ReportStatus ) m
on  c.date = m.maxdate

对于Oracle排序结果降序排列设置,并采取的第一条记录,所以你会得到的最新记录:

select * from mytable
where rownum = 1
order by date desc
SELECT t1.username, t1.date, value
FROM MyTable as t1
INNER JOIN (SELECT username, MAX(date)
            FROM MyTable
            GROUP BY username) as t2 ON  t2.username = t1.username AND t2.date = t1.date

Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)

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

我用这样的方式把最后一条记录为我有我的表中的每个用户。 这是一个查询来获取最后的位置业务员按在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
SELECT * FROM TABEL1 WHERE DATE= (SELECT MAX(CREATED_DATE) FROM TABEL1)

我的小合集

  • 自己 join 比嵌套更好 select
  • group by 不给你 primary key 这更适合 join
  • 该密钥可以由以下方式给出 partition by 和这个结合 first_value (文档)

所以,这是一个查询:

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 使用任意列的语句
  • select 过滤行中的任何列

缺点:

  • 从 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
SELECT DISTINCT Username, Dates,value 
FROM TableName
WHERE  Dates IN (SELECT  MAX(Dates) FROM TableName GROUP BY Username)


Username    Dates       value
bob         2010-02-02  1.2       
brad        2010-01-02  1.1       
fred        2010-01-03  1.0       

这也应该工作,以获得所有最新的条目,为用户。

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

您将使用聚合函数MAX和GROUP BY

SELECT username, MAX(date), value FROM tablename GROUP BY username, value
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top