Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Microsoft Office и VBA > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 22.03.2019, 14:09   #1
НиколайТретий
 
Регистрация: 22.03.2019
Сообщений: 8
По умолчанию Посчитать поля с пересекающимися отрезками

Добрый день!
Подскажите, пожалуйста по созданию запроса:
Имеются три поля.
Первое - имя клиента.
Второе - дата и время его прихода в формате 29.03.2019 12:00:00 (полный формат даты).
Третье - время обработки данного клиента (в часах) в формате 14:00
Таким образом, имеем отрезок времени для этого клиента
от 29.03.2019 12:00:00 до 30.03.2019 14:00.
И так по всем клиентам, которых может быть больше или меньше, но порядка нескольких тысяч.
Нужно выявить клиентов, которые встретятся на обработке. То есть, их отрезки пересекутся.
Возился с Count, но условие between с расчетами из разных полей записи не принимает. Where вообще работает с одной строкой. Iif вложить в Count тоже не получилось.
Наверное, опыта маловато.
НиколайТретий вне форума Ответить с цитированием
Старый 22.03.2019, 14:57   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 4,943
По умолчанию

Код:
select t1.Id, t2.ID 
from (t as t1), (t as t2) --это  будут ВСЕ пары клиентов посещений
where -- а теперь начнем отбирать
  t1.ID <> t2.ID -- для начала разные клиенты
and 
  t1.dt[приход] <t2.dt[приход] --пришел раньше
and
  t1.dt[приход] +t1.rabota {т.е. время ухода} > t2.dt[приход] --не ушел ДО прихода
сколько будет работать такой запрос не представляю, но приготовьтесь к долгому ожиданию.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2019 в 15:00.
evg_m вне форума Ответить с цитированием
Старый 22.03.2019, 15:05   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

там нужно написать через "ИЛИ" три варианта из 4-х имеющихся (трёх достаточно, ибо 4-й попадает в один из 3-х)
вот такие варианты могут быть:
TimeIntersect.png
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2019, 15:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

есть 2 отрезка: A1<A2 и B1<B2
они пересекаются если: B1<A2 and B2>A1
это учтет все варианты
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2019, 15:56   #5
НиколайТретий
 
Регистрация: 22.03.2019
Сообщений: 8
По умолчанию

Через два условия > и < тоже пытался. Не срабатывает. Может быть, потому, что сравнение идет не с конкретной датой/временем, а с вычисляемой величиной, например, "Дата/время прихода + время обработки". А может быть, из-за того, что нужно каждую запись рассчитывать с учетом отрезков ВСЕХ полей в сопоставлении со своим?
НиколайТретий вне форума Ответить с цитированием
Старый 22.03.2019, 16:00   #6
НиколайТретий
 
Регистрация: 22.03.2019
Сообщений: 8
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select t1.Id, t2.ID 
from (t as t1), (t as t2) --это  будут ВСЕ пары клиентов посещений
where -- а теперь начнем отбирать
  t1.ID <> t2.ID -- для начала разные клиенты
and 
  t1.dt[приход] <t2.dt[приход] --пришел раньше
and
  t1.dt[приход] +t1.rabota {т.е. время ухода} > t2.dt[приход] --не ушел ДО прихода
сколько будет работать такой запрос не представляю, но приготовьтесь к долгому ожиданию.
Спасибо. Попробую. Считать будет долго, согласен. База большая.
НиколайТретий вне форума Ответить с цитированием
Старый 22.03.2019, 16:01   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Сначала правильно из даты-времени начала и времени конца получи правильно дату-время конца. Остальное потом )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.03.2019, 16:12   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
есть 2 отрезка: A1<A2 и B1<B2
они пересекаются если: B1<A2 and B2>A1
это учтет все варианты
да. верно. круто!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.03.2019, 16:32   #9
НиколайТретий
 
Регистрация: 22.03.2019
Сообщений: 8
По умолчанию

Если покороче записать, то нужно для каждого поля (назовем ti) проверить условие:
ti>tj-t'i & ti<tj+t'j для всех j. И найти количество удовлетворяющих условия случаев, перебрав все tj.
Здесь t' - время обработки, соответственно, проверяемого поля i или сопоставляемого с ним поля j. По очереди нужно проверить все поля ti записи. tj - текущее сопоставляемое поле.
Если так будет проще, то можно сделать отдельные записи для ti и для tj.
НиколайТретий вне форума Ответить с цитированием
Старый 22.03.2019, 16:35   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,263
По умолчанию

Цитата:
Сообщение от НиколайТретий Посмотреть сообщение
Если покороче записать, то нужно для каждого поля (назовем ti) проверить условие:
никаких циклов. мыслите в парадигме SQL.

и начните с
Цитата:
Сообщение от Аватар Посмотреть сообщение
Сначала правильно из даты-времени начала и времени конца получи правильно дату-время конца. Остальное потом )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение области на изображении непрерывными отрезками Marsel737 Общие вопросы Delphi 5 21.04.2010 23:46
как получить значение поля грид на основе значения другого lookUp поля malayka БД в Delphi 0 21.04.2010 19:06
Выявление одинаковости значений поля в одной талице по значению поля в другой nikmay SQL, базы данных 4 13.08.2009 12:51
Найти координаты хотя бы одной точки, попадающей в область, образованную тремя пересекающимися линиями. Zibiv Помощь студентам 1 03.10.2008 17:55