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

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

提前致谢。

4

2 回答 2

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

请参阅此处的 sqlfiddle 测试。

于 2012-05-10T10:44:10.917 回答
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

于 2012-05-11T15:32:51.843 回答