2017-05-08 46 views
0

如何编写查询以显示每个用户的最新位置,类似于我的显示方式?我四处搜索,但仍未能正确实施。我将如何查询,以便显示每个用户最近的位置

+----------+-----------+----------+-----------+-------------------------+ 
| Username | Firstname | Lastname | Location |  DateandTime  | 
+----------+-----------+----------+-----------+-------------------------+ 
| ms  | mark  | smith | labs  | 2017-05-04 15:35:00.000 | 
| jb  | james  | brown | home  | 2017-05-04 18:55:00.000 | 
| cj  | charlie | jones | uni  | 2017-05-04 18:56:00.000 | 
| cj  | charlie | jones | home  | 2017-05-04 19:33:00.000 | 
| ms  | mark  | smith | shop  | 2017-05-05 15:40:00.000 | 
| jb  | james  | brown | somewhere | 2017-05-05 16:31:00.000 | 
| ms  | mark  | smith | work  | 2017-05-07 17:42:00.000 | 
| ms  | mark  | smith | market | 2017-05-07 17:45:00.000 | 
+----------+-----------+----------+-----------+-------------------------+ 

+----------+-----------+----------+-----------+-------------------------+ 
| Username | Firstname | Lastname | Location |  DateandTime  | 
+----------+-----------+----------+-----------+-------------------------+ 
| cj  | charlie | jones | home  | 2017-05-04 19:33:00.000 | 
| jb  | james  | brown | somewhere | 2017-05-05 16:31:00.000 | 
| ms  | mark  | smith | market | 2017-05-07 17:45:00.000 | 
+----------+-----------+----------+-----------+-------------------------+ 

回答

2

您可以使用窗口函数row_numbertop 1 with ties以获得最新的每一行对应一个用户名。

select top 1 with ties * 
from your_table 
order by row_number() over (
     partition by username order by dateandtime desc 
     ); 
2

这应该工作:

;with cte_a as 
(
    select distinct username, Firstname, Lastname from dbo.mytable 
) 
select a.username, a.Firstname, a.Lastname, q.[Location] [Last Location], q.DateAndTime 
from cte_a a 
outer apply 
(
    select top 1 b.[Location], b.DateAndTime 
    from dbo.myTable b 
    where b.Username = a.username 
    order by DateAndTime desc 
)q 
+1

通过@Gurwinder辛格其他答案是比我更好。 :) – GandRalph

+0

我不知道我认为适用更有效率。 – xQbert

相关问题