2013-03-26 23 views
3

我們有這張表,球員的行動正在記錄。我想找出人們在哪裏購買他們的裝備(Item弓或劍)。該設備可以在商店或拍賣中購買(該地點可在Action欄找到)。所以,當玩家購買的項目,我們需要找到Action店或拍賣(取決於它們中的哪一個發生最後一個項目是買之前)找到之前的記錄後,指定一個並加入他們

**User  Time  Action   Item** 
    1   12:00  Auction 
    2   12:01  Shop 
    3   12:04  Shop 
    4   12:09  Shop   
    4   12:15  Buy    Bow 
    2   12:15  Auction 
    2   12:19  Auction 
    1   12:25  Chat  
    4   12:33  Auction   
    3   12:47  Chat 
    1   12:47  Buy    Sword 
    2   12:47  Buy    Bow 
    3   12:50  Buy    Sword 
    4   12:52  Buy    Bow 
    3   12:56  Buy    Bow 

的resulut應

**Time  Item   Place** 
12:15  Bow   Shop 
12:47  Sword  Auction 
12:47  Bow   Auction 
12:50  Sword  Shop 
12:52  Bow   Auction 
12:56  Bow   Shop 

我我想我有一個線索如何解決與交叉申請在mssql中,但它可以解決它沒有它?我可能不得不在蜂巢中使用查詢。我會很感激任何答案。謝謝!

+0

您使用了什麼風格的SQL Server?如果你使用的是2008,你可以使用'Common Table Expression',如果你在其中包含'ROW_NUMBER()',你可以在'b.row_num_alias = a.row_num_alias-1'上加入CTE到自己。 – 2013-03-26 22:49:23

+0

@ DuncanHowe將會一直回到2005年。 – 2013-03-26 22:58:33

+0

@Aaron - 事實上 - 但我在2005年看到了使用CTE的性能問題,這在2008年沒有出現。對於2005年,我更喜歡使用臨時表。 – 2013-03-26 23:31:40

回答

1

您可能希望這樣的事情(我猜你可能會喜歡用戶在那裏爲好,不是嗎?)

修訂ANSWER感謝Tim的建議

with p as -- pick purchases 
(SELECT [user], [time] purchased, [item] 
    FROM actions 
    WHERE [action] = 'Buy' 
), e as  -- pick entrances where something can be bought 
(SELECT [user], [time] entered, [action] place 
    FROM actions 
    WHERE [action] IN ('Auction', 'Shop') 
), j as  -- join purchases with all prior entrances 
(SELECT p.[user], p.[purchased], p.[item], 
     e.[entered], e.[place] 
    FROM p 
    JOIN e on p.[user]=e.[user] 
      and p.[purchased]>=e.[entered] 
), r as  -- rank entrance closeness to purchase 
(SELECT *, row_number() over(partition by [user],[purchased],[item] 
           order by [entered] desc) as rnk 
    FROM j 
)   -- select only where entrance is the closest 
SELECT [user],[purchased],[item],[place] 
    FROM r 
    WHERE rnk = 1 
    order by [user],[purchased],[item] 

警告: TSQL不是我的家鄉話;-)

+1

請嘗試您的查詢:http://www.sqlfiddle.com/#!3/eb27f/11/0 – 2013-03-26 23:29:45

+0

謝謝Tim,非常酷。我完全重寫了我的答案:-) – WarrenT 2013-03-27 00:12:45

+0

這非常有幫助。謝謝你,蒂姆:) – Gorionovic 2013-03-27 09:21:33

0

嘗試:

select time, item, (
    select top 1 Actions.action 
    from Actions 
    where Actions.[User] = buy.[user] and 
     Actions.action in ('shop', 'auction') and 
     Actions.time < buy.time 
    order by Actions.time desc 
        ) 
from Actions as buy 
where action = 'buy' 

由Tim Schmelter提供的sqlfiddle測試(偉大的工具,我不知道!!)

+0

這對我工作正常 – 2013-03-26 23:54:04

相關問題