Гуру запроов, помогите - посуточная проверка симметрии ТВ-эфира
Есть независимый периодический регистр сведений "ТВ_Программа" с периодом в 1 сек., у него реквизит "ТВ_Передача" типа "СправочникСсылка.ТВ_Передачи".
В регистре сведений содержатся ТВ-передачи, по одной записи на каждую ТВ-передачу. Время регистра соответствует времени выхода ТВ-передачи в эфир.
В жизни, а не в регистре ТВ-передачи поделены на 2 блока:
1) с 06-00 по 17-59
2) с 18-00 по 05-59 следующего дня
Передачи из 2-го блока должны полностью повторять 1-й блок, если минуты <>45, требуется проверить, нет ли нарушений, то есть
Нужно вывести:
1) передачи из блока с 06-00 по 17-59, для которых через 12 часов:
а) нет соответствующей передачи,
б) передачи различаются
2) передачи из блока с 18-00 по 05-59 следующего дня, для которых 12 часов нет соответствующей передачи
Можно ли сделать такое одним запросом?
Сам я планирую сделать так (только сильно не пинайте):
1. Сделать к регистру подзапрос, в котором сделать вычисляемое поле Минус12Часов
2. Сделать левую связь регистра с этим подзапросом по полям "Период" и "Минус12Часов"
3. Сделать правую связь регистра с этим подзапросом, то есть левую связь, поменяв таблицу и подзапрос местами
4. Как-то объединить результаты (2) и (3)
Или есть метод лучше?
И напоследок вопрос с точки зрения оптимизации - такой запрос пройдёт по таблице 4 раза, не так ли? А если делать без запросов последовательным проходом "запись-за записью", с позиционированием на другую половину через вспомогательный объект, то нагрузка будет больше, чем пройти 1 раз, но меньше, чем 2? Или нет? База файловая, 700 Мб.
В регистре сведений содержатся ТВ-передачи, по одной записи на каждую ТВ-передачу. Время регистра соответствует времени выхода ТВ-передачи в эфир.
В жизни, а не в регистре ТВ-передачи поделены на 2 блока:
1) с 06-00 по 17-59
2) с 18-00 по 05-59 следующего дня
Передачи из 2-го блока должны полностью повторять 1-й блок, если минуты <>45, требуется проверить, нет ли нарушений, то есть
Нужно вывести:
1) передачи из блока с 06-00 по 17-59, для которых через 12 часов:
а) нет соответствующей передачи,
б) передачи различаются
2) передачи из блока с 18-00 по 05-59 следующего дня, для которых 12 часов нет соответствующей передачи
Можно ли сделать такое одним запросом?
Сам я планирую сделать так (только сильно не пинайте):
1. Сделать к регистру подзапрос, в котором сделать вычисляемое поле Минус12Часов
2. Сделать левую связь регистра с этим подзапросом по полям "Период" и "Минус12Часов"
3. Сделать правую связь регистра с этим подзапросом, то есть левую связь, поменяв таблицу и подзапрос местами
4. Как-то объединить результаты (2) и (3)
Или есть метод лучше?
И напоследок вопрос с точки зрения оптимизации - такой запрос пройдёт по таблице 4 раза, не так ли? А если делать без запросов последовательным проходом "запись-за записью", с позиционированием на другую половину через вспомогательный объект, то нагрузка будет больше, чем пройти 1 раз, но меньше, чем 2? Или нет? База файловая, 700 Мб.
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3) недавно вели разговор о конфигураторе в линуксе через браузер.
Знать бы структуру справочников, было бы хорошо. Передачи разделены на 2 блока это хорошо, но как они связаны, это другой вопрос. Передача - родитель
Части - подчиненные
или
Передача - Владелец
Части - подчиненные
Или ТВ-передача это 1 сущность.
Хорошо бы скрин регистра из конфигуратора и скрин записей, для примера
Знать бы структуру справочников, было бы хорошо. Передачи разделены на 2 блока это хорошо, но как они связаны, это другой вопрос. Передача - родитель
Части - подчиненные
или
Передача - Владелец
Части - подчиненные
Или ТВ-передача это 1 сущность.
Хорошо бы скрин регистра из конфигуратора и скрин записей, для примера
(4) Нет никаких частей. Просто передачи с 06-00 по 17-59 должны повторяться с 18-00 по 05-59 (кроме 15-минутного блока в конце каждого часа), а моя задача за этим следить.
Регистр - это ТВ-программа, какая передача когда шла. Можно было бы тупо прописать в регистр наименование передачи, но его вынесли в справочник потому, что так удобнее - можно повесить на передачу дополнительные реквизиты - наименование на языке оригинала, возрастной рейтинг, год, производитель,краткое/полное описание и т.д. - для решения данной задачи это несущественно.
Регистр - это ТВ-программа, какая передача когда шла. Можно было бы тупо прописать в регистр наименование передачи, но его вынесли в справочник потому, что так удобнее - можно повесить на передачу дополнительные реквизиты - наименование на языке оригинала, возрастной рейтинг, год, производитель,краткое/полное описание и т.д. - для решения данной задачи это несущественно.
(7)
| Период (Время эфира)| ТВ_Передача (Ссылка на справочник) |
---------------------------------------------------------------------------------------------------
| 11.01.2019 07:00 |Новости |
Так регистр выглядит?
У передачи есть длительность? 5 мин она длится или 25
| Период (Время эфира)| ТВ_Передача (Ссылка на справочник) |
---------------------------------------------------------------------------------------------------
| 11.01.2019 07:00 |Новости |
Так регистр выглядит?
У передачи есть длительность? 5 мин она длится или 25
Ничего себе запросик!
> 3. Рассчитываем ПериодыПрофилактики (для расчета анализируемый период увеличиваем на 12 часов в каждую сторону.)
Что-то я не улавливаю - зачем? И, может быть, проглядел - отлавливается ли момент, когда в другой половине есть передача, но другая?
И уж извините за наглость, нельзя ли добавить к этому запросу, чтобы для дат в интервале с ДатаX по ДатаY (3-4 дня) период был бы не 12, а 6 часов, то есть:
1) с 06-00 по 11-59 идёт что-то
2) с 12-00 по 17-59 повторяется (1)
3) с 18-00 по 23-59 идёт что-то другое
4) на следующий день с 00-00 по 05-59 повторяется (2)
45 минут в конце каждого часа пропускаем, как обычно
Никак не соображу, как это всунуть в данный запрос :(((
> 3. Рассчитываем ПериодыПрофилактики (для расчета анализируемый период увеличиваем на 12 часов в каждую сторону.)
Что-то я не улавливаю - зачем? И, может быть, проглядел - отлавливается ли момент, когда в другой половине есть передача, но другая?
И уж извините за наглость, нельзя ли добавить к этому запросу, чтобы для дат в интервале с ДатаX по ДатаY (3-4 дня) период был бы не 12, а 6 часов, то есть:
1) с 06-00 по 11-59 идёт что-то
2) с 12-00 по 17-59 повторяется (1)
3) с 18-00 по 23-59 идёт что-то другое
4) на следующий день с 00-00 по 05-59 повторяется (2)
45 минут в конце каждого часа пропускаем, как обычно
Никак не соображу, как это всунуть в данный запрос :(((
(21)
Это нужно, чтобы в анализ попали профилактики, которые могли не попасть в сам анализируемый период. Например, вы анализируете передачи с 0 до 12 часов, а профилактика была, допустим, в 18:30 предыдущего дня.
Если я правильно понял вашу логику, то для такой передачи (которая "в другой половине") будет отсутствовать аналогичная ей передача в предыдущем блоке и она попадет в отчет.
Вы можете сделать и более узкие блоки нужной вам длительности.
Для этого в первом запросе пакета меняете расчет начала и конца блока для каждой передачи на нужный вам период. А во втором запросе соответственно корректируете расчет границ предыдущего и следующего блоков.
Для блоков по 6 часов первые два запроса будут выглядеть так:
> 3. Рассчитываем ПериодыПрофилактики (для расчета анализируемый период увеличиваем на 12 часов в каждую сторону.)
Что-то я не улавливаю - зачем?
Что-то я не улавливаю - зачем?
Это нужно, чтобы в анализ попали профилактики, которые могли не попасть в сам анализируемый период. Например, вы анализируете передачи с 0 до 12 часов, а профилактика была, допустим, в 18:30 предыдущего дня.
И, может быть, проглядел - отлавливается ли момент, когда в другой половине есть передача, но другая?
Если я правильно понял вашу логику, то для такой передачи (которая "в другой половине") будет отсутствовать аналогичная ей передача в предыдущем блоке и она попадет в отчет.
И уж извините за наглость, нельзя ли добавить к этому запросу, чтобы для дат в интервале с ДатаX по ДатаY (3-4 дня) период был бы не 12, а 6 часов
Вы можете сделать и более узкие блоки нужной вам длительности.
Для этого в первом запросе пакета меняете расчет начала и конца блока для каждой передачи на нужный вам период. А во втором запросе соответственно корректируете расчет границ предыдущего и следующего блоков.
Для блоков по 6 часов первые два запроса будут выглядеть так:
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача,
ТВ_Программа.Период,
ВЫБОР
КОГДА ЧАС(ТВ_Программа.Период) < 6
ТОГДА НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ)
КОГДА ЧАС(ТВ_Программа.Период) >= 6
И ЧАС(ТВ_Программа.Период) < 12
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 6)
КОГДА ЧАС(ТВ_Программа.Период) >= 12
И ЧАС(ТВ_Программа.Период) < 18
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 12)
КОГДА ЧАС(ТВ_Программа.Период) >= 18
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 18)
КОНЕЦ КАК НачалоБлока,
ВЫБОР
КОГДА ЧАС(ТВ_Программа.Период) < 6
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -18)
КОГДА ЧАС(ТВ_Программа.Период) >= 6
И ЧАС(ТВ_Программа.Период) < 12
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -12)
КОГДА ЧАС(ТВ_Программа.Период) >= 12
И ЧАС(ТВ_Программа.Период) < 18
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -6)
КОГДА ЧАС(ТВ_Программа.Период) >= 18
ТОГДА КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ)
КОНЕЦ КАК КонецБлока
ПОМЕСТИТЬ ПередачиАнализируемогоПериода
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
ТВ_Программа.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И МИНУТА(ТВ_Программа.Период) < 45
И ТВ_Программа.ТВ_Передача.Код <> &КодПередачи_Профилактика
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПередачиАнализируемогоПериода.ТВ_Передача,
ПередачиАнализируемогоПериода.Период,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.НачалоБлока, ЧАС, -6) КАК ПредыдущийБлок_Начало,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.КонецБлока, ЧАС, -6) КАК ПредыдущийБлок_Конец,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.НачалоБлока, ЧАС, 6) КАК СледующийБлок_Начало,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.КонецБлока, ЧАС, 6) КАК СледующийБлок_Конец
ПОМЕСТИТЬ ПередачиСГраницамиПредыдущегоИСледующегоБлоков
ИЗ
ПередачиАнализируемогоПериода КАК ПередачиАнализируемогоПериода
;
Показать
Здравствуйте !
первая временная таблица должна иметь поля:
ТВ_Передача
Выбрать Когда Час(Период) с 6 по 17 Тогда 1 Иначе 2 Конец как ТипПериода
Выбрать Когда Час(Период) < 6 Тогда ДеньГода(Период)-1 Иначе ДеньГода(Период) Конец как ДеньСравнения
Потом соединяете ее саму с собой полным соединением,
по условию (ТВ_Передача1 = ТВ_Передача2) И (ТипПериода1 <> ТипПериода2) И (ДеньСравнения1 = ДеньСравнения2)
ищете поля, где ТВ_Передача1 is null ИЛИ ТВ_Передача2 is null
Запрос может не работать на "стыке" двух лет.
Если редко пользуетесь запросом, оптимизировать не нужно.
первая временная таблица должна иметь поля:
ТВ_Передача
Выбрать Когда Час(Период) с 6 по 17 Тогда 1 Иначе 2 Конец как ТипПериода
Выбрать Когда Час(Период) < 6 Тогда ДеньГода(Период)-1 Иначе ДеньГода(Период) Конец как ДеньСравнения
Потом соединяете ее саму с собой полным соединением,
по условию (ТВ_Передача1 = ТВ_Передача2) И (ТипПериода1 <> ТипПериода2) И (ДеньСравнения1 = ДеньСравнения2)
ищете поля, где ТВ_Передача1 is null ИЛИ ТВ_Передача2 is null
Запрос может не работать на "стыке" двух лет.
Если редко пользуетесь запросом, оптимизировать не нужно.
(6) А если передача будет повторяться в пределах своего 12-часового блока? Новости, например. Хотелось бы сравнивать ссылку на передачу с аналогичной через 12 часов в ту или другую сторону
> Если редко пользуетесь запросом, оптимизировать не нужно.
Главное, не положить бы базу.
> Если редко пользуетесь запросом, оптимизировать не нужно.
Главное, не положить бы базу.
Возможен ли люфт времени повторения передачи или соответствие до секунд?
Нужно ли считать замену отдельных передач нарушением всей симметрии или считать последующие передачи симметричными?
Аналогичный вопрос касательно возможности "выкусывания" отдельных передач со смещением по времени последующих передач.
В общем, главный посыл такой - если возможны всякие ньюансы или объемы данных очень велики, то не надо морочить голову пытаясь сделать это все одним запросом. И проще и более масштабируемо будет порционно идти "скользящим окном" (используя запросы только для чтения порций) и делать соответствующие проверки на машине состояний.
ЗЫ. Если проверка симметрии строго посуточная, то вообще все просто. Но зная, как на практике обычно разрастаются такие задачи, я бы сразу не загонял всю бизнес-логику в один запрос, чтобы потом не переделывать все с нуля, когда условия усложнятся. Порции бы вычитывал запросом, а анализировал их алгоритмически.
Нужно ли считать замену отдельных передач нарушением всей симметрии или считать последующие передачи симметричными?
Аналогичный вопрос касательно возможности "выкусывания" отдельных передач со смещением по времени последующих передач.
В общем, главный посыл такой - если возможны всякие ньюансы или объемы данных очень велики, то не надо морочить голову пытаясь сделать это все одним запросом. И проще и более масштабируемо будет порционно идти "скользящим окном" (используя запросы только для чтения порций) и делать соответствующие проверки на машине состояний.
ЗЫ. Если проверка симметрии строго посуточная, то вообще все просто. Но зная, как на практике обычно разрастаются такие задачи, я бы сразу не загонял всю бизнес-логику в один запрос, чтобы потом не переделывать все с нуля, когда условия усложнятся. Порции бы вычитывал запросом, а анализировал их алгоритмически.
(12)
> Возможен ли люфт времени повторения передачи или соответствие до секунд?
До секунд. Проверка строго индивидуальная - каждой передаче должна соответствовать такая же из другой половины вещательных суток *) - через 12 часов или за 12 часов до неё
*) Вещательные сутки начинаются в 06-00, то есть идут со сдивгом в 6 часов по сравнению с обыкновенными.
> Но зная, как на практике обычно разрастаются такие задачи
Вы как в воду глядели - на арену выходит "Профилактика"
> Возможен ли люфт времени повторения передачи или соответствие до секунд?
До секунд. Проверка строго индивидуальная - каждой передаче должна соответствовать такая же из другой половины вещательных суток *) - через 12 часов или за 12 часов до неё
*) Вещательные сутки начинаются в 06-00, то есть идут со сдивгом в 6 часов по сравнению с обыкновенными.
> Но зная, как на практике обычно разрастаются такие задачи
Вы как в воду глядели - на арену выходит "Профилактика"
Вишенка на торте - на арену выходит "Профилактика"
То есть, когда выполняются одновременно 3 условия:
1) в первый месяц квартала (январь/апрель/июль/октябрь)
2) в неделю, где есть 15-е число
3) в ночь со вторника на среду
в конец вещательного вторника и в начало вещательной среды ставится специальная передача "Профилактика". (Календарно это в обоих случаях будет среда). В результате без пары остаётся целая группа программ, и простая связь по времени здесь не подходит.
В методе "запись-за-записью" можно использовать ПолучитьПоследнее(), чтобы узнать для непарной записи: "А не профилактика ли соответствует времени X?" - и не выводить такие записи. А как быть с запросом?
Можно, конечно, их потОм рукам почикать - но это же будет не спортивно.
То есть, когда выполняются одновременно 3 условия:
1) в первый месяц квартала (январь/апрель/июль/октябрь)
2) в неделю, где есть 15-е число
3) в ночь со вторника на среду
в конец вещательного вторника и в начало вещательной среды ставится специальная передача "Профилактика". (Календарно это в обоих случаях будет среда). В результате без пары остаётся целая группа программ, и простая связь по времени здесь не подходит.
В методе "запись-за-записью" можно использовать ПолучитьПоследнее(), чтобы узнать для непарной записи: "А не профилактика ли соответствует времени X?" - и не выводить такие записи. А как быть с запросом?
Можно, конечно, их потОм рукам почикать - но это же будет не спортивно.
Сделал по такой схеме:
1. Выбираем в таблицу ПередачиАнализируемогоПериода передачи за интересующий нас период (подозреваю, что регистр ваш большой),
рассчитываем даты начала и конца блока для каждой передачи,
исключаем профилактику, и передачи где минута > 45
2. По таблице ПередачиАнализируемогоПериода рассчитываем таблицу ПередачиСГраницамиПредыдущегоИСледующегоБлоков
где вычисляем даты начала и конца предыдущего и следующего блока для каждой передачи.
3. Рассчитываем ПериодыПрофилактики (для расчета анализируемый период увеличиваем на 12 часов в каждую сторону.)
4. Вычисляем ПромежуточныйРезультат левым соединением ПередачиСГраницамиПредыдущегоИСледующегоБлоков
с таблицей регистра соответственно для предыдущего (ТВ_ПрограммаПред) и для следующего (ТВ_ПрограммаСлед) блока.
Определяем, есть ли нарушения симметрии
5. Выводим только передачи с нарушениями.
В принципе, есть еще простор для оптимизации... 1 и 2 можно объединить в один запрос, но так нагляднее.
В общем, попробуйте.
1. Выбираем в таблицу ПередачиАнализируемогоПериода передачи за интересующий нас период (подозреваю, что регистр ваш большой),
рассчитываем даты начала и конца блока для каждой передачи,
исключаем профилактику, и передачи где минута > 45
2. По таблице ПередачиАнализируемогоПериода рассчитываем таблицу ПередачиСГраницамиПредыдущегоИСледующегоБлоков
где вычисляем даты начала и конца предыдущего и следующего блока для каждой передачи.
3. Рассчитываем ПериодыПрофилактики (для расчета анализируемый период увеличиваем на 12 часов в каждую сторону.)
4. Вычисляем ПромежуточныйРезультат левым соединением ПередачиСГраницамиПредыдущегоИСледующегоБлоков
с таблицей регистра соответственно для предыдущего (ТВ_ПрограммаПред) и для следующего (ТВ_ПрограммаСлед) блока.
Определяем, есть ли нарушения симметрии
5. Выводим только передачи с нарушениями.
В принципе, есть еще простор для оптимизации... 1 и 2 можно объединить в один запрос, но так нагляднее.
В общем, попробуйте.
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача,
ТВ_Программа.Период,
ВЫБОР
КОГДА ЧАС(ТВ_Программа.Период) >= 6
И ЧАС(ТВ_Программа.Период) < 18
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 6)
КОГДА ЧАС(ТВ_Программа.Период) >= 18
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 18)
КОГДА ЧАС(ТВ_Программа.Период) < 6
ТОГДА ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -6)
КОНЕЦ КАК НачалоБлока,
ВЫБОР
КОГДА ЧАС(ТВ_Программа.Период) >= 6
И ЧАС(ТВ_Программа.Период) < 18
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -6)
КОГДА ЧАС(ТВ_Программа.Период) >= 18
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, 6)
КОГДА ЧАС(ТВ_Программа.Период) < 6
ТОГДА ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТВ_Программа.Период, ДЕНЬ), ЧАС, -18)
КОНЕЦ КАК КонецБлока
ПОМЕСТИТЬ ПередачиАнализируемогоПериода
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
ТВ_Программа.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
И МИНУТА(ТВ_Программа.Период) < 45
И ТВ_Программа.ТВ_Передача.Код <> &КодПередачи_Профилактика
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПередачиАнализируемогоПериода.ТВ_Передача,
ПередачиАнализируемогоПериода.Период,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.НачалоБлока, ЧАС, -12) КАК ПредыдущийБлок_Начало,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.КонецБлока, ЧАС, -12) КАК ПредыдущийБлок_Конец,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.НачалоБлока, ЧАС, 12) КАК СледующийБлок_Начало,
ДОБАВИТЬКДАТЕ(ПередачиАнализируемогоПериода.КонецБлока, ЧАС, 12) КАК СледующийБлок_Конец
ПОМЕСТИТЬ ПередачиСГраницамиПредыдущегоИСледующегоБлоков
ИЗ
ПередачиАнализируемогоПериода КАК ПередачиАнализируемогоПериода
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача,
ТВ_Программа.Период КАК ДатаНачалаПрофилактики,
МИНИМУМ(ТВ_Программа1.Период) КАК ДатаОкончанияПрофилактики
ПОМЕСТИТЬ ПериодыПрофилактики
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТВ_Программа КАК ТВ_Программа1
ПО ТВ_Программа.Период < ТВ_Программа1.Период
ГДЕ
ТВ_Программа.ТВ_Передача.Код = &КодПередачи_Профилактика
И ТВ_Программа.Период МЕЖДУ ДОБАВИТЬКДАТЕ(&ДатаНачала, ЧАС, -12) И ДОБАВИТЬКДАТЕ(&ДатаОкончания, ЧАС, 12)
СГРУППИРОВАТЬ ПО
ТВ_Программа.ТВ_Передача,
ТВ_Программа.Период
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПередачиСГраницамиПредыдущегоИСледующегоБлоков.ТВ_Передача,
ПередачиСГраницамиПредыдущегоИСледующегоБлоков.Период,
ВЫБОР
КОГДА ТВ_ПрограммаПред.ТВ_Передача ЕСТЬ NULL
И ПериодыПрофилактикиПред.ТВ_Передача ЕСТЬ NULL
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ОтсутствуетВПредыдущемБлоке,
ВЫБОР
КОГДА ТВ_ПрограммаСлед.ТВ_Передача ЕСТЬ NULL
И ПериодыПрофилактикиСлед.ТВ_Передача ЕСТЬ NULL
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК ОтсутствуетВСледующемБлоке
ПОМЕСТИТЬ ПромежуточныйРезультат
ИЗ
ПередачиСГраницамиПредыдущегоИСледующегоБлоков КАК ПередачиСГраницамиПредыдущегоИСледующегоБлоков
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТВ_Программа КАК ТВ_ПрограммаПред
ПО ПередачиСГраницамиПредыдущегоИСледующегоБлоков.ТВ_Передача = ТВ_ПрограммаПред.ТВ_Передача
И (ТВ_ПрограммаПред.Период МЕЖДУ ПередачиСГраницамиПредыдущегоИСледующегоБлоков.ПредыдущийБлок_Начало И ПередачиСГраницамиПредыдущегоИСледующегоБлоков.ПредыдущийБлок_Конец)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТВ_Программа КАК ТВ_ПрограммаСлед
ПО ПередачиСГраницамиПредыдущегоИСледующегоБлоков.ТВ_Передача = ТВ_ПрограммаСлед.ТВ_Передача
И (ТВ_ПрограммаСлед.Период МЕЖДУ ПередачиСГраницамиПредыдущегоИСледующегоБлоков.СледующийБлок_Начало И ПередачиСГраницамиПредыдущегоИСледующегоБлоков.СледующийБлок_Конец)
ЛЕВОЕ СОЕДИНЕНИЕ ПериодыПрофилактики КАК ПериодыПрофилактикиПред
ПО (ДОБАВИТЬКДАТЕ(ПередачиСГраницамиПредыдущегоИСледующегоБлоков.Период, ЧАС, -12) МЕЖДУ ПериодыПрофилактикиПред.ДатаНачалаПрофилактики И ПериодыПрофилактикиПред.ДатаОкончанияПрофилактики)
ЛЕВОЕ СОЕДИНЕНИЕ ПериодыПрофилактики КАК ПериодыПрофилактикиСлед
ПО (ДОБАВИТЬКДАТЕ(ПередачиСГраницамиПредыдущегоИСледующегоБлоков.Период, ЧАС, 12) МЕЖДУ ПериодыПрофилактикиСлед.ДатаНачалаПрофилактики И ПериодыПрофилактикиСлед.ДатаОкончанияПрофилактики)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ПромежуточныйРезультат.ТВ_Передача,
ПромежуточныйРезультат.Период,
ПромежуточныйРезультат.ОтсутствуетВПредыдущемБлоке,
ПромежуточныйРезультат.ОтсутствуетВСледующемБлоке
ИЗ
ПромежуточныйРезультат КАК ПромежуточныйРезультат
ГДЕ
(ПромежуточныйРезультат.ОтсутствуетВПредыдущемБлоке
ИЛИ ПромежуточныйРезультат.ОтсутствуетВСледующемБлоке)
Показать
(20)
> Или прекратим страдать фигней извращаясь в реляционной алгебре
Заказчик хочет запрос, значит, будет ему запрос :)
> сделаем банальный параллельный проход на конечном автомате
А это как? Что тут имеется в виду?
Лично у меня один проход с позиционированием плюс-минус 12 часов (или 6) через другой объект.
Прочитал "конечный автомат" - в голову пришла ещё идея - при проходе по первой половине забивать данные в ТЗ, при проходе по второй - удалять совпадения и в конце половины выводить.
> Или прекратим страдать фигней извращаясь в реляционной алгебре
Заказчик хочет запрос, значит, будет ему запрос :)
> сделаем банальный параллельный проход на конечном автомате
А это как? Что тут имеется в виду?
Лично у меня один проход с позиционированием плюс-минус 12 часов (или 6) через другой объект.
Прочитал "конечный автомат" - в голову пришла ещё идея - при проходе по первой половине забивать данные в ТЗ, при проходе по второй - удалять совпадения и в конце половины выводить.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот