2016-08-25 48 views
2

對於我的具體情況,n = 4,但可能有一天需要n = 5或n = 6。我的查詢在每個名稱的'n'行上的一列中顯示'n'最近的日期。我想爲每個名稱的'n'近期日期列

我需要的頂級描述:我有一個表格,它允許我將名稱和日期添加到跳轉日誌中。我需要構建一個查詢,爲每個跳線顯示四個最近的跳轉,併爲每個日期顯示一列。 JUMPID,名稱,日期:

我的形式,其中有3個字段中的「跳轉」表存儲的數據。樣本數據是這樣的:

JUMPID NAME DATE 
1  Joe 01-Jul-16 
2  Joe 15-Jul-16 
3  Adam 15-Jul-16 
4  Joe 26-Jul-16 
5  Ryan 28-Jul-16 
6  Adam 02-Aug-16 
7  Joe 10-Aug-16 
8  Adam 10-Aug-16 
9  Joe 12-Aug-16 
10  Mike 19-Aug-16 
11  Joe 19-Aug-16 
12  Mike 19-Aug-16 
13  Dave 19-Aug-16 
14  Ryan 23-Aug-16 

我現在使用該查詢返回每個跳線4個最近的跳躍,但存儲所有在同一列的日期。查詢是:

Select NAME, [DATE] 
From [JUMP] 
Where DATE In 
    (Select Top 4 [DATE] 
    From [JUMP] jum 
    Where [JUMP].[NAME] = jum.[NAME] 
    Order By jum.[DATE] DESC;) 
Order By NAME, [DATE] DESC; 

從該查詢輸出顯示如下:

NAME DATE 
Adam 10-Aug-16 
Adam 02-Aug-16 
Adam 15-Jul-16 
Dave 19-Aug-16 
Joe  19-Aug-16 
Joe  12-Aug-16 
Joe  10-Aug-16 
Joe  26-Jul-16 
Mike 19-Aug-16 
Mike 19-Aug-16 
Ryan 23-Aug-16 
Ryan 28-Jul-16 

我要的是這4個最近跳轉到每個人都有自己列,例如:

NAME RECENT1  RECENT2  RECENT3  RECENT4 
Adam 10-Aug-16 02-Aug-16 15-Jul-16 
Dave 19-Aug-16 
Joe  19-Aug-16 12-Aug-16 10-Aug-16 26-Jul-16 
Mike 19-Aug-16 19-Aug-16 
Ryan 23-Aug-16 28-Jul-16 

重複日期都很好,一樣可以跳在一天內跳超過一次。對於跳轉次數少於4次的跳線,空或空字段適用於日期。

我已經通過使用谷歌中間得到了一半,這幫助我建立了上面的查詢。任何幫助達到我的首選最終狀態將非常感激。

+1

我刪除了不兼容的數據庫標籤。請爲您真正使用的數據庫添加標籤。 –

+0

這是在MS Access 2007中使用的,這就是我添加訪問標籤的原因。我不確定MySQL標籤。 – nytewulf97

+2

您需要sql用於數據透視。很多例子可以在這裏找到,或者只是搜索一下。 MS Access專門有TRANSFORM – Serg

回答

1

我花了幾個小時試圖解決我的問題,使用MS Access中的TRANSFORM ... PIVOT方法,Serg建議沒有成功。我認爲這主要是因爲缺乏一個額外的領域,將每次跳躍分類爲最近的1,2,3,4或不再跟蹤。我無法想象在每次跳躍時都不更新每個跳投者記錄的這個字段的方式。我可能是錯的,我不確定,因爲我再次不是專家。如果有一種方法可以爲每次跳轉指定一個值,即我原來的查詢作爲計算字段(?)返回,那麼我將使用TRANSFORM方法。

也就是說,我確實找到了一個大多可行的解決方案,但在我看來,它很笨拙。我說的主要是因爲如果跳投在一天內跳得不止一次,那就打破了。我的部分解決方案涉及創建4個獨立的查詢來分別識別第一個,第二個,第三個和第四個最新的跳轉,然後將這4個查詢組合成最終查詢。

四個查詢是這樣的:

Select NAME, DATE 
From JUMP As jum 
Where (
     Select Count(NAME) 
     From JUMP 
     Where NAME = jum.NAME 
     AND DATE > jum.DATE) = 0; (0 gives me most recent, 1 second most recent, etc.) 

信用此查詢去Charles Bretana在這個計算器的問題。我真的不明白它是如何做到的,但它適用於我需要的東西,除非跳投跳投不止一次。

使用這4個查詢,然後我構建了另一個查詢它結合了4成1,這個查詢看起來是這樣的:

SELECT Query1.NAME, Query1.DATE, Query2.DATE, Query3.DATE, Query4.DATE 
FROM ((Query2 RIGHT JOIN Query1 ON Query2.NAME=Query1.NAME) 
     LEFT JOIN Query3 ON Query1.NAME = Query3.NAME) 
     LEFT JOIN Query4 ON Query1.NAME = Query4.NAME 
ORDER BY query1.NAME; 

這給了我,我需要它在格式的數據:與名行和4列,其中每一次爲第一/第二/第三/第四次最近的跳躍,但在有一天跳超過一次的跳投時會中斷。使用上面的原始樣本數據,得到的數據表看起來是這樣的:

NAME RECENT1 RECENT2 RECENT3 RECENT4 
Adam 10-Aug-16 02-Aug-16 15-Jul-16 
Dave 19-Aug-16 
Joe  19-Aug-16 12-Aug-16 10-Aug-16 26-Jul-16 
Mike 19-Aug-16 
Mike 19-Aug-16 
Ryan 23-Aug-16 28-Jul-16 

如果有更優雅的解決方案在那裏,我很樂意看到他們。或者,如果有人知道如何解決我在一天中跳過一次以上的問題,我會喜歡一些輸入。謝謝。

+0

很確定你的問題在'AND DATE> jum.DATE'。更改爲'AND DATE> = jum.DATE'應該可以解決您的問題。 –

+0

@Breich我嘗試了你的建議,但沒有奏效。當我在'AND DATE> = jum.DATE)= 0;'的查詢上嘗試編輯時,查詢沒有返回記錄,對於'= 1/2/3',它將結果轉換爲未編輯的結果'= 0/1/2'。 – nytewulf97