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

結果は

**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のクロスアプライでそれを解決する方法の手がかりを持っていると思いますが、それなしでそれを解決することは可能ですか?ハイブでもクエリを使用する必要があるかもしれません。どんな答えでもありがたいです。ありがとうございました!

4

2 に答える 2

1

あなたはこのようなものが欲しいかもしれません(そして私はあなたがそこにいるユーザーも好きかもしれないと思います、え?)

ティムの提案のおかげで更新された答え

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は私のネイティブ方言ではありません;-)

于 2013-03-26T23:19:05.573 に答える
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のおかげでテストされました(素晴らしいツール、私は知りませんでした!!)

于 2013-03-26T23:33:03.963 に答える