Выберите повторы в течение периода времени - PullRequest
4 голосов
/ 17 сентября 2011

Если бы у меня была большая таблица (100000 + записей), в которой были служебные записи или, возможно, записи о приеме. Как бы я нашел все случаи повторного появления в течение определенного количества дней.

Настройка таблицы может выглядеть примерно так, возможно, с большим количеством столбцов.

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

Я пытаюсь выбрать способ выбора записей, в которых повторное вхождение поля [Идентификатор клиента] происходит в течение определенного периода времени (

Это то, что я хотел бы, чтобы он выглядел, как только он будет запущен, скажем, 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, но изо всех сил пытался найти решение SQL в MS Access. У меня есть несколько SQL-запросов, которые я пробовал, но я не уверен, что я на правильном пути.

Любой совет будет оценен.

Ответы [ 3 ]

3 голосов
/ 17 сентября 2011

Я думаю, что это четкое выражение того, что вы хотите. Это не очень высокая производительность, но я не уверен, что вы можете избежать или коррелированного подзапроса, или декартового соединения таблицы с самим собой, чтобы решить эту проблему. Это стандартный SQL-код, который должен работать практически на любом движке, хотя детали математики даты могут отличаться:

 SELECT * FROM YourTable YT1 WHERE EXISTS
    (SELECT * FROM YourTable YT2 WHERE
        YT2.CustomerID = YT1.CustomerID AND YT2.StartTime <= YT2.FinishTime + 7)
0 голосов
/ 17 сентября 2011

Это будет сделано:

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. Я не знаю, как переписать его для доступа.

0 голосов
/ 17 сентября 2011

Чтобы сделать это, вам нужно сделать самостоятельное соединение, когда вы сравниваете всю таблицу с собой.Если предположить, что похожие имена будут выглядеть примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...