2011-09-17 18 views
4

如果我有一個包含服務記錄或許可錄取記錄的大表(100000個條目)。我如何在特定天數內找到所有重新出現的情況。在時間<x天內選擇重複出現次數

表設置可能是這樣的東西可能與更多的列。

Record ID Customer ID Start Date Time  Finish Date Time 
1   123456  24/04/2010 16:49  25/04/2010 13:37 
3   654321  02/05/2010 12:45  03/05/2010 18:48 
4   764352  24/03/2010 21:36  29/03/2010 14:24 
9   123456  28/04/2010 13:49  31/04/2010 09:45 
10   836472  19/03/2010 19:05  20/03/2010 14:48 
11   123456  05/05/2010 11:26  06/05/2010 16:23 

我所試圖做的是制定出一個方式來選擇那裏是場[客戶ID]的再次發生一定的時間段(< X天)內的記錄。 (如果這個時期是第二發生的開始日期時間 - 第一次出現的完成日期時間

這是我想它的樣子,一旦它被用於例如x = 7

Record ID Customer ID Start Date Time  Finish Date Time Re-occurence 
9   123456  28/04/2010 13:49  31/04/2010 09:45 1 
11   123456  05/05/2010 11:26  06/05/2010 16:23 2 
運行什麼。

我可以用Excel中的一小部分記錄來解決這個問題,但在MS Access中很難提出一個SQL解決方案。我確實有一些我試過的SQL查詢,但我不確定我是否在正確的軌道上

任何意見將不勝感激

回答

3

我認爲這是您想要的清晰表達。這不是非常高的性能,但我不確定是否可以避免相關子查詢或表的笛卡爾聯接來解決此問題。這是標準的SQL,應在幾乎所有發動機工作時,雖然日期數學的細節可能有所不同:

SELECT * FROM YourTable YT1 WHERE EXISTS 
    (SELECT * FROM YourTable YT2 WHERE 
     YT2.CustomerID = YT1.CustomerID AND YT2.StartTime <= YT2.FinishTime + 7) 
+0

我認爲這種方法錯過了復發次數。爲了使其發揮作用,您需要在頂級查詢中添加一個group和一個count函數。 – dlawrence

+0

不,它會比這複雜得多(因爲頂級查詢將返回屬於不同「重複團體」的customerID的事件,也不會返回「重複團隊」中的最終事件)。 –

+0

另外,我的查詢返回「reoccurence組」中的中間事件 - 它也會在樣本中返回記錄9。我從這個問題的文本描述開始,並且不情願地對樣本數據沒有太多關注。但是我確實看到了如何返回中間結果來消除缺少的最終結果,並允許用GROUP BY正確解決問題(FinishTime除外),如您所述。 –

0

爲了做到這一點,你需要做一個自我加入成爲你整個表進行比較本身。假設相似的名字會是這個樣子:

select r1.customer_id, min(start_time), max(end_time), count(1) as reoccurences 
from records r1, 
     records r2 
where r1.record_id > r2.record_id -- this ensures you don't double count the records 
and r1.customer_id = r2.customer_id 
and r1.finish_time - r2.start_time <= 7 
group by r1.customer_id 

你將無法輕鬆地獲得這兩個RECORD_ID和出現次數的多少,但你可以回去和開始時間相關的發現用該customer_id和start_time記錄號碼。

+0

這裏有一些好主意,但示例數據爲客戶123456提供了兩個輸出記錄,其中您的查詢只會生成一個記錄。 –

0

這將做到這一點:

declare @t table(Record_ID int, Customer_ID int, StartDateTime datetime, FinishDateTime datetime) 

insert @t values(1 ,123456,'2010-04-24 16:49','2010-04-25 13:37') 
insert @t values(3 ,654321,'2010-05-02 12:45','2010-05-03 18:48') 
insert @t values(4 ,764352,'2010-03-24 21:36','2010-03-29 14:24') 
insert @t values(9 ,123456,'2010-04-28 13:49','2010-04-30 09:45') 
insert @t values(10,836472,'2010-03-19 19:05','2010-03-20 14:48') 
insert @t values(11,123456,'2010-05-05 11:26','2010-05-06 16:23') 

declare @days int 
set @days = 7 

;with a as (
select record_id, customer_id, startdatetime, finishdatetime, 
rn = row_number() over (partition by customer_id order by startdatetime asc) 
from @t), 
b as (
select record_id, customer_id, startdatetime, finishdatetime, rn, 0 recurrence 
from a 
where rn = 1 
union all 
select a.record_id, a.customer_id, a.startdatetime, a.finishdatetime, 
a.rn, case when a.startdatetime - @days < b.finishdatetime then recurrence + 1 else 0 end 
from b join a 
on b.rn = a.rn - 1 and b.customer_id = a.customer_id 
) 
select record_id, customer_id, startdatetime, recurrence from b 
where recurrence > 0 

結果: http://data.stackexchange.com/stackoverflow/q/112808/

我才意識到應該在訪問來完成。我很抱歉,這是爲sql server 2005編寫的。我不知道如何重寫它以進行訪問。