2012-05-10 113 views
2

我有表像下面复制最近的位置

ID User Date  Location 
1 Tom 6-Mar-2012 US 
2 Tom 4-Feb-2012 UK 
3 Tom 6-Jan-2012 Uk 
4 Bob 6-Mar-2012 UK 
5 Bob 4-Feb-2012 UK 
6 Bob 6-Jan-2012 AUS 
7 Dev 6-Mar-2012 US 
8 Dev 4-Feb-2012 AUS 
9 Nic 6-Jan-2012 US 

我得在同一个表中的每个员工最近的位置。

ID User Date  Location CurrentLocation 
1 Tom 6-Mar-2012 US  US 
2 Tom 4-Feb-2012 UK  US 
3 Tom 6-Jan-2012 Uk  US 
4 Bob 6-Mar-2012 UK  UK 
5 Bob 4-Feb-2012 UK  UK 
6 Bob 6-Jan-2012 AUS  UK 
7 Dev 6-Mar-2012 US  US 
8 Dev 4-Feb-2012 AUS  US 
9 Nic 6-Jan-2012 US  US 

我已经厌倦了临时表。我可以使用单个查询来完成这项工作吗?这正在执行中。我已经创建了很多临时表。

在此先感谢。

回答

1

试试这个:

select *, CurrentLocation 
from tbl x 

outer apply 
(
    select top 1 location as CurrentLocation 
    from tbl 
    where [user] = x.[user] 
    and id <= x.id 
    order by id 

) y 

order by id 

输出:

ID  USER DATE   LOCATION CURRENTLOCATION 
1  Tom  2012-03-06  US   US 
2  Tom  2012-02-04  UK   US 
3  Tom  2012-01-06  Uk   US 
4  Bob  2012-03-06  UK   UK 
5  Bob  2012-02-04  UK   UK 
6  Bob  2012-01-06  AUS   UK 
7  Dev  2012-03-06  US   US 
8  Dev  2012-02-04  AUS   US 
9  Nic  2012-01-06  US   US 

现场测试:http://www.sqlfiddle.com/#!3/83a6a/7

+0

非常感谢。代码像魅力一样工作。我做的唯一改变是取代ID,我取了Date。 – Gokul

1

select 
    id, 
    user, 
    date, 
    location, 
    first_value(location) over(partition by user order by date desc) as current_location 
from your_table s; 

上面仅在Oracle是有效的。

这是我在没有FIRST_VALUE解析函数的尝试:

select 
    a.id, 
    a.usr, 
    a.date, 
    a.location, 
    m.location as current_location 
from 
    a 
    join 
    (select usr, location 
    from 
     (select usr, 
       location, 
       row_number() over(partition by usr order by date desc) as rnk 
      from a 
     )b 
    where rnk = 1) m 
    on m.usr = a.usr; 

m个内部查询包含了最新的用户条目的记录。 在此之后,我会加入此视图,以获取用户的位置。

here sqlfiddle测试。

+0

你好,非常感谢俺们。我应该更换FIRST_VALUE – Gokul

+0

FIRST_VALUE是SQL服务器的有效功能。 –

+0

我收到错误消息:消息195,级别15,状态10,行2 'first_value'不是公认的内置函数名称。 – Gokul