SQL Server表添加组查询中上次访问的id
我有一个SQL Server数据库表,其中包含用户列表及其上次访问。我想为所有访客提取最后一次访问的列表,以及表id 让我举个例子来更好地解释。 这是一个简化的版本SQL Server表添加组查询中上次访问的id,sql,sql-server,select,group-by,greatest-n-per-group,Sql,Sql Server,Select,Group By,Greatest N Per Group,我有一个SQL Server数据库表,其中包含用户列表及其上次访问。我想为所有访客提取最后一次访问的列表,以及表id 让我举个例子来更好地解释。 这是一个简化的版本 Visits | id | visitor | last_visit | |----|---------|------------| | 1| ABC | 2014-04-06 | | 2| DEF | 2014-04-06 | | 3| GHI | 2014-04-07 | | 4|
Visits
| id | visitor | last_visit |
|----|---------|------------|
| 1| ABC | 2014-04-06 |
| 2| DEF | 2014-04-06 |
| 3| GHI | 2014-04-07 |
| 4| DEF | 2014-04-07 |
| 5| ABC | 2014-04-08 |
| 6| JKL | 2014-04-10 |
| 7| DEF | 2014-04-12 |
以下是我想要得到的:
| id | visitor | last_visit |
|----|---------|------------|
| 3| GHI | 2014-04-07 |
| 5| ABC | 2014-04-08 |
| 6| JKL | 2014-04-10 |
| 7| DEF | 2014-04-12 |
我通过进行一个简单的分组,在没有id列的情况下获得了结果:
SELECT visitor, MAX(last_visit) FROM visits GROUP BY visitor
但是我不知道如何添加id,这对于我的目的是非常重要的。试试这个:
SELECT a.id, a.visitor, a.last_visit
FROM visits a
INNER JOIN (SELECT visitor, MAX(last_visit) last_visit
FROM visits
GROUP BY visitor
) AS b on a.visitor = b .visitor and a.last_visit = b.last_visit;
或
SELECT a.id, a.visitor, a.last_visit
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY a.visitor ORDER BY a.last_visit DESC) AS RowNo,
a.id, a.visitor, a.last_visit
FROM visits a
) AS a
WHERE RowNo = 1;
使用行编号()
而不是分组依据
:
select v.*
from (select v.*, row_number() over (partition by visitor order by last_visit desc) as seqnum
from visits v
) v
where seqnum = 1;
我有大量的记录,这两个记录中哪一个会提供更好的性能?如果您完全确定last_vist是随着ID的增加而增加的,您可以选择
max(ID)
。这个例子看起来是这样的,所以。