2015-04-30 85 views
3

我正在處理一個需要此操作的查詢,但對於此論壇問題,我將使用一個假設場景,因爲我最感興趣的是該方法而非一次性解決方案。如何計算Microsoft Access SQL查詢中的連續日期?

假設每天一個孩子做得很好,他/她的老師會記錄孩子的姓名和他/她做得很好的日期。

Table: Kids 
*PID Name 
---- ---- 
1  Abigail 
2  Jim 
3  Peter 

Table: GoodJobHistory 
*KidID  *EventDate 
-----  --------- 
1   1/1/2015 
1   1/2/2015 
1   1/3/2015 
1   1/4/2015 
2   1/1/2015 
2   1/2/2015 
3   1/1/2015 
3   1/5/2015 
2   1/5/2015 

* refers to a table key 

我想,這將產生像這樣的查詢:

Query: query_GoodJobStreak 
KidID  EndOfStreak ConsecutiveDays 
-----  ----------- --------------- 
1   1/4/2015  4 
2   1/2/2015  2 
3   1/1/2015  1 
3   1/5/2015  1 
2   1/5/2015  1 

大多數情況下,我在尋找任何的例子,資源鏈接,也許我會怎麼走,甚至簡要說明關於這樣做。 (a)不適用於Access,(b)只計算最新記錄並忽略歷史記錄,或者(c)沒有工作。先謝謝你。

回答

1

你可以做一個巧妙的技巧來找到連續的範圍。首先,編號歷史表中的所有行,由KidID分區並按事件日期排序。

KidID  EventDate Number 
-----  --------- ------ 
1   1/1/2015 1 
1   1/2/2015 2 
1   1/3/2015 3 
1   1/4/2015 4 

2   1/1/2015 1 
2   1/2/2015 2 
2   1/5/2015 3 

3   1/1/2015 1 
3   1/5/2015 2 

然後找到行號和事件日期之間的數字差異。要找到日期和數字之間的「差異」,我們首先必須將日期轉換爲數字。 Access可以自動執行此操作,因爲日期實際上是作爲幕後數字存儲的(自從1/1/1900起的天數)。

KidID  EventDate Number EventDateNumber Diff 
-----  --------- ------ --------------- ---- 
1   1/1/2015 1  42005   42004 a 
1   1/2/2015 2  42006   42004 a 
1   1/3/2015 3  42007   42004 a 
1   1/4/2015 4  42008   42004 a 

2   1/1/2015 1  42005   42004 b 
2   1/2/2015 2  42006   42004 b 
2   1/5/2015 3  42009   42006 c 

3   1/1/2015 1  42005   42004 d 
3   1/5/2015 2  42009   42006 e 

您應該已經看到該模式。任何連續的一組值都分享完全相同的差異值!我使用字母旁邊的Diff標記了五個連續的範圍。這是一個簡單的技巧,可以利用這些技巧將數據分成多組連續範圍,並查找您之後的結果。

首先我們需要一種將行號添加到原始數據的方法。這可以用一個簡單的DCount函數來完成(注意這開始計數在0但邏輯的作品出來的一樣):上述分開,因此它可以被引用

SELECT GoodJobHistory.KidID, 
     GoodJobHistory.EventDate, 
     DCount("KidID", "GoodJobHistory","KidID=" & [KidID] & 
         " And EventDate<#" & [EventDate] & "#") AS RowNumber 
FROM GoodJobHistory; 

保存查詢的子查詢(我叫它GoodJobHistoryNumbered在我的例子),那麼一個簡單的組通過對日期和ROWNUMBER之間的差額得到我們正在尋找的結果:

SELECT GoodJobHistoryNumbered.KidID, 
     Max(GoodJobHistoryNumbered.EventDate) AS EndOfStreak, 
     Count(GoodJobHistoryNumbered.RowNumber) AS ConsecutiveDays 
FROM GoodJobHistoryNumbered 
GROUP BY GoodJobHistoryNumbered.KidID, [EventDate]-[RowNumber]; 

結果:

KidID EndOfStreak ConsecutiveDays 
1  1/4/2015 4 
2  1/2/2015 2 
2  1/5/2015 1 
3  1/1/2015 1 
3  1/5/2015 1