Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Господа, приветствую.

Проблема несколькими словами...
Есть таблица календаря работы человека. Всего 360 дней на человека с несколькими вахтами работы, длящиеся приблизительно дней 40.
Есть определенные маркеры начала и конца вахт (Пр и От)

Как вывести в одной строке в двух полях дату начала и дату окончания вахты человека,
ну и по строкам эти несколько вахт за год?

К сообщению приложен файл. Размер - 15Kb
29 янв 19, 14:30    [21796864]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Игортан,

Это скрин формы на перекрестном запросе.
В таблице поля
Id, Работник, Дата, Значение
29 янв 19, 14:32    [21796869]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Игортан,

Я делал на промежуточных запросах выделения начала и конца вахт
00tetsPr - начало вахты
00tetsOt - конец вахты

INSERT INTO 00tetsPrTemp ( Id, Worker, DateFrom, DateTo, CurMonth, CurYear )
SELECT [00tetsPr].Id, [00tetsPr].Worker, [00tetsPr].DatePr AS DateFrom, 
(SELECT TOP 1 DateOT FROM [00tetsOt] where [00tetsOt].Worker=[00tetsPr].Worker and DateOT>=DatePr order by DateOT) AS DateTo, 
[00tetsPr].CurMonth, [00tetsPr].CurYear
FROM 00tetsPr;

Но с вложенным запросом работает медленно....т.к. просчет и вывод конечного результата на лету,
скорость не устраивает.
29 янв 19, 14:48    [21796903]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Я один не вижу работника в перекрестном запросе?
29 янв 19, 14:49    [21796904]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Игортан, наверное, было понятнее со структурой таблиц.
29 янв 19, 14:51    [21796906]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Озверин,

Выбор сотрудника выше. Это просто скрин (обрезанный) формы календаря работы сотрудников
Вопрос не к конкретном сотруднике
29 янв 19, 14:52    [21796908]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18446
Сперва надо выбросить перекрёстный запрос. Для работы нужна плоская таблица (Дата-Маркер).
Первым делом двумя подзапросами выбираются начала и концы вахт. Затем они связываются по условию Начала.Дата < Концы.Дата. После этого группируются по Начала.Дата, и берётся MIN(Концы.Дата). Всё, у тебя в руках периоды вахт.
29 янв 19, 15:00    [21796920]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18446
Т.е. если есть таблица

CREATE TABLE table (dDate, tStatus)


то

SELECT starts.dDate vStart, MIN(ends.dDate) vEnd
FROM ( SELECT dDate
       FROM table
       WHERE tStatus = 'Пр' ) starts,
     ( SELECT dDate
       FROM table
       WHERE tStatus = 'От' ) ends
WHERE starts.dDate < ends.dDate
GROUP BY starts.dDate


Есссно в набор попадут только полные вахты. Если есть вахта, переходящая границу года - можно в подзапросы добавить виртуальные записи за 1 января и 31 декабря (UNION).
29 янв 19, 15:06    [21796928]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Озверин,


Прошу прощения, вот пример бд

00tetsPr- определение начала вахты
00tetsOt - определение конца вахты
01testOtPr - собирал их в один.
02CalendarWorkerYes - сохраняю график рабочих дней в таблицу.
Это старая версия, в ней есть минусы, из за нее и начал переделывать.
Просто там дальше я ищу пересечение этих данных с другими

01testOtPr_ - новая попытка вытягивать период, вот сейчас выполнение запроса тянет на сек 30-35

К сообщению приложен файл (test1.part01.rar - 145Kb) cкачать
29 янв 19, 15:19    [21796941]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Игортан,

К сообщению приложен файл (test1.part02.rar - 145Kb) cкачать
29 янв 19, 15:19    [21796942]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Игортан,

К сообщению приложен файл (test1.part03.rar - 43Kb) cкачать
29 янв 19, 15:19    [21796943]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Игортан,

Не поместилось в одном...
29 янв 19, 15:20    [21796945]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Akina
Сперва надо выбросить перекрёстный запрос. Для работы нужна плоская таблица (Дата-Маркер).
Она и есть - CalendarWork

Akina
Первым делом двумя подзапросами выбираются начала и концы вахт. Затем они связываются по условию Начала.Дата < Концы.Дата. После этого группируются по Начала.Дата, и берётся MIN(Концы.Дата). Всё, у тебя в руках периоды вахт.

У меня так и реализовано сейчас, только не вложенными, но медленно работает...
и еще условие, что не обязательно первой в году будет дата начала вахты. Вахта может заканчиваться с прошлого года.

Вообще суть вот в чем.
Есть вахты сотрудников, и есть периоды возможности проверок ТБ, например, работников.
Нужно найти в этих 2 таблицах (вахт и проверок) даты пересечения, что бы назначить дни прохождения проверок.
29 янв 19, 15:30    [21796956]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
Akina
SELECT starts.dDate vStart, MIN(ends.dDate) vEnd
FROM ( SELECT dDate
       FROM table
       WHERE tStatus = 'Пр' ) starts,
     ( SELECT dDate
       FROM table
       WHERE tStatus = 'От' ) ends
WHERE starts.dDate < ends.dDate
GROUP BY starts.dDate


Спасибо!
Переделал запрос по вашему образцу, летает.

INSERT INTO 00tetsPrTemp ( Worker, DateFrom, DateTo )
SELECT [00tetsPr].Worker, DatePr, Min(DateOT) AS [Min-DateOT]
FROM 00tetsOt INNER JOIN 00tetsPr ON [00tetsOt].Worker = [00tetsPr].Worker
WHERE (((DateOT)>[DatePr]))
GROUP BY [00tetsPr].Worker, DatePr;
29 янв 19, 15:50    [21796993]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4403
Игортан,

на одного из работников задвоен весь месяц--это у вас допустимо
WorkergmdValueCal
73875120187111
73875120187112
73875120187211
73875120187212
73875120187311
73875120187312
73875120187411
73875120187412
73875120187511
73875120187512
73875120187611
73875120187612
73875120187711
738751201877От
73875120187811
738751201878В
738751201879В
738751201879От
29 янв 19, 16:43    [21797081]     Ответить | Цитировать Сообщить модератору
 Re: Выборка нескольких пересечений периодов в течение года  [new]
Игортан
Member

Откуда: Беларусь
Сообщений: 872
ПЕНСИОНЕРКА,

Спасибо, проверю, от куда это.
Но задвоения, в любом случае, не должно быть.
30 янв 19, 00:27    [21797367]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить