2012-05-10 89 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