|
Сравнение дат в запросе по строкам | ☑ | ||
---|---|---|---|---|
0
Apimitey
naïve
31.10.24
✎
23:05
|
Здравствуйте! Прошу помочь с решением тестового задания. Нужен только текст запроса. Сам только учусь программированию и язык запросов на начальном уровне.
На странице расположить только таблицу значений, заполняемую автоматически при открытии обработки. ● Исходные данные содержатся в двух независимых непериодических регистрах сведений конфигурации: «Платформы» и «ОтветственныеЛица». ● РС «Платформы» имеет одно измерение («Название», тип Строка (длина - 150)) и один ресурс («ДатаРелиза», тип Дата (состав даты – только дата)). ● РС «ОтветственныеЛица» имеет два измерения: «ДатаПриема» (тип Дата (состав даты – только дата)) и «ФИО» (Строка (длина - 150)). ● В таблицу значений необходимо вывести ФИО ответственного, работающего на момент релиза каждой платформы из таблицы. ● Вся логика сбора данных должны быть реализована одним запросом. Примеры таблиц:Платформы Название ДатаРелиза App-4_2_18 11.02.2021 App-4_3_11 17.06.2022 App-5_0_1 25.11.2023 Base-21_8 15.05.2020 Base-22_3 05.12.2020 Oracle-2 09.07.2019 Oracle-3 08.08.2022 WRT-13 02.02.2024 ОтветственныеЛица ДатаПриема ФИО 01.02.2018 Тестова Е. И. 01.03.2022 Проверов Н. С. 01.04.2023 Умнов И. И. Итоговая таблица на форме обработки: Платформа Ответственный App-4_2_18 Тестова Е. И. App-4_3_11 Проверов Н. С. App-5_0_1 Умнов И. И. Base-21_8 Тестова Е. И. Base-22_3 Тестова Е. И. Oracle-2 Тестова Е. И. Oracle-3 Проверов Н. С. WRT-13 Умнов И. И. |
|||
1
Волшебник
31.10.24
✎
16:28
|
Кривая структура данных. Дурацкая постановка задачи.
|
|||
2
Garykom
гуру
31.10.24
✎
16:32
|
(0)
1. даты увольнения нет 2. одновременно могут работать два сотрудника или более, почему только одного выводить? 3. ФИО сотрудников могут совпадать 4. почему ТЗ а не ДС? ТЗ на УФ в тонком это нежелательно |
|||
3
Волшебник
31.10.24
✎
16:32
|
(0) Заведите РС ОтвественныеПоПлатформам с измерениями Платформа и Лицо.
Кстати, это должны быть справочники, а не строки. Можете добавить поле ДатаНачала или сделать регистр периодическим, тогда измерение Платформа, а Лицо - ресурс. |
|||
4
Apimitey
naïve
31.10.24
✎
16:31
|
Раз даты увольнения нет, значит принимаем, что последний принятый сотрудник является ответственным.
|
|||
5
Волшебник
31.10.24
✎
16:32
|
(4) Это враньё. Мы не можем этого принимать, потому что может быть принята УБОРЩИЦА
|
|||
6
asady
31.10.24
✎
16:35
|
(0) соедини таблицы по Датарелиза>=ДатаПриема результат во временную таблицу
Затем выбери из этой временной таблицы в другую временную таблицу только мин даты прима в группировке по платформе результат соединяй первую со второй по платформе и дате приема = останется только твой результат |
|||
7
Волшебник
31.10.24
✎
16:36
|
Правильная структура:
Спр. "Платформы", реквизит "ДатаРелиза" Спр. "ОтветственныеЛица", реквизит "ДатаПриема" РС "Ответственные по платформам", периодический измерение - Платформа (спр. Платформы) ресурс - Ответственный (спр. ОтветственныеЛица) регистр заполняется ВРУЧНУЮ! |
|||
8
Garykom
гуру
31.10.24
✎
16:36
|
(7) роли с правами где?
|
|||
9
Apimitey
naïve
31.10.24
✎
16:36
|
(3) Делаю по заданию. Регистры создать проблем нет.
Далее создаем запрос. В первую временную таблицу помещаем данные из РС ответственные лица и упорядочиваем по возрастанию даты. Во вторую временную таблицу данные из РС Платформы. Не могу сообразить, как их потом соединить. |
|||
10
Волшебник
31.10.24
✎
16:37
|
(8) Так на базе БСП
|
|||
11
Garykom
гуру
31.10.24
✎
16:38
|
(9) не тупи
у тебя ключ соединения это дата поэтому выборка из Платформы и соединяешь с подзапросом по ОтветственныеЛица для выбора только одной записи |
|||
12
Garykom
гуру
31.10.24
✎
16:39
|
кстати не сказано что выводить если нет ответственного лица
|
|||
13
Apimitey
naïve
31.10.24
✎
23:05
|
(6) Подскажите, пожалуйста, как выбрать мин даты приема с группировкой по платформе?
ПодробностиВЫБРАТЬ ОтветственныеЛица.ДатаПриема КАК ДатаПриема, ОтветственныеЛица.ФИО КАК ФИО ПОМЕСТИТЬ ВТ ИЗ РегистрСведений.ОтветственныеЛица КАК ОтветственныеЛица ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Платформы.Название КАК Название, Платформы.ДатаРелиза КАК ДатаРелиза ПОМЕСТИТЬ ВТ2 ИЗ РегистрСведений.Платформы КАК Платформы ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.ДатаПриема КАК ДатаПриема, ВТ.ФИО КАК ФИО, ВТ2.Название КАК Название, ВТ2.ДатаРелиза КАК ДатаРелиза ПОМЕСТИТЬ ВТ3 ИЗ ВТ2 КАК ВТ2 ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ ПО (ВТ.ДатаПриема <= ВТ2.ДатаРелиза) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ3.ДатаРелиза КАК ДатаРелиза, ВТ3.ДатаПриема КАК ДатаПриема, ВТ3.ФИО КАК ФИО, ВТ3.Название КАК Название ПОМЕСТИТЬ ВТ4 ИЗ ВТ3 КАК ВТ3 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ4.ДатаРелиза КАК ДатаРелиза, ВТ4.ДатаПриема КАК ДатаПриема, ВТ4.ФИО КАК ФИО, ВТ4.Название КАК Название ИЗ ВТ4 КАК ВТ4 |
|||
14
Волшебник
31.10.24
✎
17:02
|
(13) у Вас ВТ3 и ВТ4 идентичны
|
|||
15
Garykom
гуру
31.10.24
✎
17:02
|
(13) маловато ВТ...
|
|||
16
Волшебник
31.10.24
✎
17:09
|
Все сопоставления двух сущностей по ДатаПриема и ДатаРелиза неправомочны.
Сопоставление должно быть через реквизит (например, Спр.Платформа, реквизит "Ответственный") или таблицу-связку, например, РС "Ответственные по платформам" |
|||
17
Мультук
гуру
31.10.24
✎
17:18
|
(13)
Нужно выучить функции агрегирования: МИНИМУМ() МАКСИМУМ() СУММА() КОЛИЧЕСТВО() СГРУППИРОВАТЬ ПО google: Хрусталева язык запросов 1С google: Введение в SQL Грабер Мартин |
|||
18
DiMel_77
31.10.24
✎
23:04
|
(0) Я бы интервалы определил для начала. Например так:
ПодробностиВЫБРАТЬ ДАТАВРЕМЯ(2018, 2, 1) КАК ДатаПриема, "Тестова Е. И." КАК ФИО ПОМЕСТИТЬ Даты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 3, 1), "Проверов Н. С." ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2023, 4, 1), "Умнов И. И." ; ВЫБРАТЬ Слева.ФИО КАК ФИО, Слева.ДатаПриема КАК НачалоИнтервала, МИНИМУМ(ЕстьNULL(Справа.ДатаПриема, ДАТАВРЕМЯ(3999, 1, 1))) КАК КонецИнтервала ИЗ Даты КАК Слева ЛЕВОЕ СОЕДИНЕНИЕ Даты КАК Справа ПО Слева.ДатаПриема < Справа.ДатаПриема СГРУППИРОВАТЬ ПО Слева.ДатаПриема, Слева.ФИО Ну а соединить наборы самостоятельно попробуйте. |
|||
19
osa1C
31.10.24
✎
20:12
|
(18) Зачем? Для кривой задачи, ещё более кривое решение? Как я понимаю в этой тестовой задаче надо для каждой платформы подобрать сотрудника по срезу последних из таблицы ОтветственныеЛица по дате приема. И зачем ты делаешь две даты приема и ещё их сравниваешь?
|
|||
20
Волшебник
31.10.24
✎
20:32
|
(19) >> для каждой платформы
Вот здесь уже пошла чушь. Платформа одна и та же. У неё просто названия меняются. |
|||
21
DiMel_77
31.10.24
✎
20:33
|
(19) покажите решение со срезом и посмотрим, какой запрос быстрее отработает.
|
|||
22
osa1C
31.10.24
✎
22:27
|
(21) Задача конечно дурацкая, как и предложенное решение, но при такой постановке задачи работает. Непонятно что делать, если дата платформы раньше, чем все даты приема ответственных. И не понятно кого из ответственных выбирать, если у них совпадают даты приема.
КодВЫБРАТЬ ДАТАВРЕМЯ(2018, 2, 1) КАК ДатаПриема, "Тестова Е. И." КАК ФИО ПОМЕСТИТЬ Даты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 3, 1), "Проверов Н. С." ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2023, 4, 1), "Умнов И. И." ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДАТАВРЕМЯ(2021, 2, 11) КАК ДатаРелиза, "App-4_2_18" КАК Платформа ПОМЕСТИТЬ ДатыПлатформ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 6, 17), "App-4_3_11" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2023, 11, 25), "App-5_0_1" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2020, 5, 15), "Base-21_8" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2020, 12, 5), "Base-22_3" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019, 7, 9), "Oracle-2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 8, 8), "Oracle-3" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2024, 2, 2), "WRT-13" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДатыПлатформ.Платформа КАК Платформа, МАКСИМУМ(Даты.ДатаПриема) КАК ДатаПриема ПОМЕСТИТЬ Список ИЗ Даты КАК Даты ЛЕВОЕ СОЕДИНЕНИЕ ДатыПлатформ КАК ДатыПлатформ ПО Даты.ДатаПриема <= ДатыПлатформ.ДатаРелиза СГРУППИРОВАТЬ ПО ДатыПлатформ.Платформа ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Список.Платформа КАК Платформа, Даты.ФИО КАК ФИО ИЗ Список КАК Список ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты ПО Список.ДатаПриема = Даты.ДатаПриема |
|||
23
DiMel_77
31.10.24
✎
23:56
|
(22) Да такой запрос лучше. У меня профдеформация уже с интервальными регистрами... На этом наборе данных разницы незаметишь, а если 100 тыс записей запрос с интервалами проиграет.
КодВЫБРАТЬ ДАТАВРЕМЯ(2018, 2, 1) КАК ДатаПриема, "Тестова Е. И." КАК ФИО ПОМЕСТИТЬ Даты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 3, 1), "Проверов Н. С." ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2023, 4, 1), "Умнов И. И." ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДАТАВРЕМЯ(2021, 2, 11) КАК ДатаРелиза, "App-4_2_18" КАК Платформа ПОМЕСТИТЬ ДатыПлатформ ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 6, 17), "App-4_3_11" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2023, 11, 25), "App-5_0_1" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2020, 5, 15), "Base-21_8" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2020, 12, 5), "Base-22_3" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2019, 7, 9), "Oracle-2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2022, 8, 8), "Oracle-3" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(2024, 2, 2), "WRT-13" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Слева.ФИО КАК ФИО, Слева.ДатаПриема КАК НачалоИнтервала, МИНИМУМ(ЕСТЬNULL(Справа.ДатаПриема, ДАТАВРЕМЯ(3999, 1, 1))) КАК КонецИнтервала ПОМЕСТИТЬ ВТИнтервалы ИЗ Даты КАК Слева ЛЕВОЕ СОЕДИНЕНИЕ Даты КАК Справа ПО Слева.ДатаПриема < Справа.ДатаПриема СГРУППИРОВАТЬ ПО Слева.ДатаПриема, Слева.ФИО ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДатыПлатформ.Платформа КАК Платформа, ВТИнтервалы.ФИО КАК ФИО ИЗ ВТИнтервалы КАК ВТИнтервалы ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыПлатформ КАК ДатыПлатформ ПО (ДатыПлатформ.ДатаРелиза >= ВТИнтервалы.НачалоИнтервала) И (ДатыПлатформ.ДатаРелиза < ВТИнтервалы.КонецИнтервала) Хоть код научился оформлять правильно... Хотя сравнение в статье https://infostart.ru/1c/articles/1302246/ показывает почти одинаковую производительность стандартного и интервального подхода |
|||
24
osa1C
01.11.24
✎
00:16
|
(23) да не в производительности дело. Она на самом деле будет почти одинакова. В читаемости кода. Создание каких-то интервалов... Это запутывает при прочтении кода через энное количество времени
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |