复制最近的位置

时间:2012-05-10 10:41:44

标签: sql sql-server

我有如下表格

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

我厌倦了临时表。我可以使用单个查询完成此操作。这是在实施的中间。我已经创建了许多临时表。

先谢谢。

2 个答案:

答案 0 :(得分: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;

内部查询包含具有最新用户条目的记录。 在此之后,我使用此视图进行连接,以获取用户的位置。

参见here sqlfiddle test。

答案 1 :(得分: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