Дублируются строки

1. aalu14 15.12.22 15:04 Сейчас в теме
Добрый день, из-за второго вложенного запроса ("Исходящий") дублируются строки в результате запроса. Пытался через вт - результат другой, не подходит. Подскажите, как исправить, заранее спасибо!

ВЫБРАТЬ
	Активность.Период КАК Дата,
	Активность.Автор КАК Сотрудник,
	Активность.Реквизит,
	Активность.Значение,
	Активность.СтароеЗначение
ИЗ
	РегистрСведений.Активность КАК Активность,
	(ВЫБРАТЬ
		Активность.Период КАК Дата
	ИЗ
		РегистрСведений.Активность КАК Активность
	ГДЕ
		(ВЫРАЗИТЬ(Активность.Значение КАК СТРОКА(100))) = "Авто"
		И Активность.Объект = &Объект) КАК ВложенныйЗапрос,
	(ВЫБРАТЬ
	Активность.Период КАК Дата
ИЗ
	РегистрСведений.Активность КАК Активность
ГДЕ
	Активность.Реквизит = "Исходящий звонок"
	И Активность.Объект = &Объект) КАК Исходящий
ГДЕ
	Активность.Объект = &Объект
	И Активность.Период >= ВложенныйЗапрос.Дата
	И (((Активность.Реквизит = "СМС"
				ИЛИ Активность.Реквизит = "sms"
				ИЛИ Активность.Реквизит = "E-mail"
				ИЛИ Активность.Реквизит = "Обещание"
				ИЛИ Активность.Реквизит = "Исходящий звонок")
				И Активность.Автор.Родитель.Код = "Вз"
			ИЛИ (ВЫРАЗИТЬ(Активность.Значение КАК СТРОКА(100))) = "Авто")
			ИЛИ (Активность.Реквизит = "" И Активность.Период > Исходящий.Дата и  Активность.Период < ДОБАВИТЬКДАТЕ(Исходящий.Дата,Минута,5)))

УПОРЯДОЧИТЬ ПО
	Дата
Показать
По теме из базы знаний
Найденные решения
56. soft_wind 16.12.22 10:31 Сейчас в теме
(30) попробуйте такой запрос,
(потом можете вставить его в СКД-отчет и сгруппировать по полю Объект, будет вообще красиво)
//РегистрСведений.Активность, поля: дата, объект, автор, реквизит, значение.
//формируем таблицу только с записями "Исходящий звонок" 
Выбрать
	рег.*
поместить втТаб
из
РегистрСведений.Активность рег
где
	рег.Реквизит = "Исходящий звонок" 
;

//результирующая выборка
//1.сами строчки с "Исходящий звонок" 
Выбрать
втТаб.*
из втТаб

Объединить все

//2. дополнительные строчки с "" и интевалом 5 мин (= 300 сек) 
Выбрать
	рег.*
из
	втТаб
внутреннее соединение РегистрСведений.Активность рег
по втТаб.объект = Рег.объект //связь по объекту
	и Рег.Реквизит = "" //по условию что Реквизит = ""
	и РазностьДат(втТаб.Дата, рег.Дата, Секунда) <= 300 //и попадающие в 5 минут

упорядочить по
Объект, Дата
	
	
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. glek 119 15.12.22 15:12 Сейчас в теме
(1) а как запросы должны между собой связываться?
3. aalu14 15.12.22 15:22 Сейчас в теме
(2) Связал по объекту, но все равно дублируются строки...
5. glek 119 15.12.22 15:23 Сейчас в теме
(3) Всё равно не понимаю сакрального смысла вложенного запроса.Для чего он?
6. aalu14 15.12.22 15:26 Сейчас в теме
(5)Первый вложенный запрос - получаю дату записи со значением "Авто", в итоговом запросе делаю выборку по дате бОльшей полученной из вложенного запроса; второй вложенный запрос - получаю дату записи с реквизитом "исходящий запрос", в итоговом запросе делаю выборку с условием по дате > полученной из второго вложенного и < той же + 5 минут

Подскажите, как это наиболее рационально сделать, если мое решение вышло нелогичным?
8. glek 119 15.12.22 15:30 Сейчас в теме
(6)
Вы выбираете все записи из таблицы.
Первым вложенным вы выбираете ВСЕ даты по одному значению
Вторым вложенным ВСЕ даты по другому значению.
Конечно будет дублировать.
У Вас концептуально в запросе бред.
11. aalu14 15.12.22 15:33 Сейчас в теме
(8) Спасибо, что указали на ошибку. Действительно, первый вложенный не влияет на дубли, так как там всего одна такая запись возможна, а про второй не подумал. Спасибо!
10. DBV 15.12.22 15:31 Сейчас в теме
(3) Где там связь таблиц?
12. aalu14 15.12.22 15:34 Сейчас в теме
(10) в вопросе нигде, уже исправил
4. starjevschik 15.12.22 15:22 Сейчас в теме
язык запросов все же требует некоторой квалификации. Сначала учеба, потом применение. Наоборот не работает...
7. aalu14 15.12.22 15:28 Сейчас в теме
(4) Это верно, но задачу необходимо выполнить, времени на учебу прямо сейчас нет :(
9. starjevschik 15.12.22 15:30 Сейчас в теме
(7) задача невыполнима без учебы. Это как водить автомобиль, невозможно сесть и доехать до Питера, не научившись предварительно.
На самом деле это недолго, достаточно прочитать какой-нибудь приличный курс по языку SQL, несколько дней и несложные задачи будут решаться без проблем.
14. aalu14 15.12.22 15:47 Сейчас в теме
(9)Трудно с Вами не согласиться!
15. пользователь 15.12.22 15:49
Сообщение было скрыто модератором.
...
18. aalu14 15.12.22 16:04 Сейчас в теме
(15) Думаю, получить опыт для обучения, даже просто сидя рядом с водителем, - тоже хорошо.
22. пользователь 15.12.22 16:30
Сообщение было скрыто модератором.
...
23. aalu14 15.12.22 17:34 Сейчас в теме
(22) Ничего, прокачусь на переднем, потом расскажу Вам как там в мире программирования...
24. пользователь 15.12.22 17:36
Сообщение было скрыто модератором.
...
25. aalu14 15.12.22 17:38 Сейчас в теме
(24) Но и не вам давать советы, раз не предлагаете свои услуги за бесплатно или нет.
26. пользователь 15.12.22 17:40
Сообщение было скрыто модератором.
...
27. aalu14 15.12.22 17:41 Сейчас в теме
(26) Да, именно за советом, но не за порцией желчи
28. пользователь 15.12.22 17:45
Сообщение было скрыто модератором.
...
31. aalu14 15.12.22 17:48 Сейчас в теме
(29) Взаимно, удачных попуток!
32. пользователь 15.12.22 17:52
Сообщение было скрыто модератором.
...
34. aalu14 15.12.22 18:01 Сейчас в теме
(32) советую посетить Новую Голландию
36. пользователь 15.12.22 18:02
Сообщение было скрыто модератором.
...
13. soft_wind 15.12.22 15:42 Сейчас в теме
что бы хоть что-то подсказать нужна полная структура регистра и подробное описание задачи!
иначе не понятно что с чем соединять/сравнивать и какой в итоге результат должен получиться.
16. aalu14 15.12.22 15:54 Сейчас в теме
(13) Минимизирую условия до проблемы. Регистр: период (дата), автор, реквизит, значение.
Мне необходимо вывести запись с реквизит = "Исходящий звонок" и следующие записи с реквизит = "", у которых период (дата) с момента исходящего звонка прошло не более 5 минут.
т.е. период записи (с реквизит = "Исходящий звонок") < период (с реквизит = "") < период записи (с реквизит = "Исходящий звонок") + 5 минут
17. soft_wind 15.12.22 16:02 Сейчас в теме
а записи с этими реквизитами как-то связаны между собой (например по Автору?)

очень непонятное описание,
допустим есть реквизит "Исходящий звонок" и по условию еще больше 100 строк в течении 5 минут с пустым реквизитом
как вы представляете себе такой результат?
19. aalu14 15.12.22 16:05 Сейчас в теме
(17)
а записи с этими реквизитами как-то связаны между собой (например по Автору?)
Связь по объекту, не уточнил, рассматривается один объект, это документ. В теч. 5 минут там строк 0-5
20. soft_wind 15.12.22 16:12 Сейчас в теме
Регистр: период (дата), автор, реквизит, значение.

а в описании структуры регистра не видно реквизита: Объект (тип Документ) ?

(дааа...)
21. aalu14 15.12.22 16:13 Сейчас в теме
(20) Да, я написал, что не уточнил
29. soft_wind 15.12.22 17:45 Сейчас в теме
(27) (может сойдет за совет?)
Попробуйте еще раз четко и внятно описать задачу!

т.к. Правильно и понятно поставленная задача это уже половина решения!!!
Zevzm; user1881120; +2 Ответить
30. пользователь 15.12.22 17:48
Сообщение было скрыто модератором.
...
33. aalu14 15.12.22 17:57 Сейчас в теме
(29)
Регистр:
дата, объект, автор, реквизит, значение.
Записи:
15.12.22 16:00, заявление 1, А, "исходящий звонок", ""
15.12.22 16:02, заявление 1, А, "", не ответил
15.12.22 16:03, заявление 1, А, "", сбросил
15.12.22 16:04, заявление 1, А, "", заблокирован
15.12.22 16:10, заявление 1, А, "",повтор

15.12.22 17:00, заявление 1, А, "исходящий звонок", ""
15.12.22 17:01, заявление 1, А, "", не ответил
15.12.22 17:02, заявление 1, А, "", сбросил
15.12.22 17:10, заявление 1, А, "", повтор

Необходимо взять записи с реквизитом "Исходящий звонок" + записи с реквизитом "", которые появились в теч 5 минут после "Исходящий звонок"

т.е. в конечную выборку должны попасть:
15.12.22 16:00, заявление 1, А, "исходящий звонок", ""
15.12.22 16:02, заявление 1, А, "", не ответил
15.12.22 16:03, заявление 1, А, "", сбросил
15.12.22 16:04, заявление 1, А, "", заблокирован


15.12.22 17:00, заявление 1, А, "исходящий звонок", ""
15.12.22 17:01, заявление 1, А, "", не ответил
15.12.22 17:02, заявление 1, А, "", сбросил

Что я пытаюсь сделать: найти дату исходящего звонка и сравнить ее.
Так как записей с рек "исходящий звонок", то записи дублируются.
35. пользователь 15.12.22 18:02
Сообщение было скрыто модератором.
...
37. aalu14 15.12.22 18:04 Сейчас в теме
(35) Сравнить период остальных записей с реквизитом "" - чтобы отобрать те, которые добавлены в промежуток от периода записи с рек "Исх звонок" до периода записи с рек "Исх звонок" + 5 минут.
там первый запрос - получаю период записи с рек "Исх звонок", а потом последнее условие в основном запросе
38. starjevschik 15.12.22 18:09 Сейчас в теме
(33) Это не совсем тривиальная задача и простым запросом с парой таблиц не решается.
Если ее так уж надо решить, не обучаясь запросам, я бы советовал выгрузить все в таблицу значений и ее дальше обрабатывать. Будет не так быстро работать, но требует знаний только синтаксиса 1С и можно сделать намного быстрее, чем искать того, кто не поленится бесплатно делать запрос.
39. пользователь 15.12.22 18:11
Сообщение было скрыто модератором.
...
40. aalu14 15.12.22 18:17 Сейчас в теме
(38)Именно так и решил, но все же интересно, как решается задача средствами языка запросов, ведь задача с выборкой строк, взависимости от значений других, как мне казалось, классическая.
41. пользователь 15.12.22 18:27
Сообщение было скрыто модератором.
...
42. aalu14 15.12.22 18:36 Сейчас в теме
(41) Да, уже понятно! Да и не ждал, что кто-то будет бесплатно делать запрос, просто направить, как это сделал ты, но я рассчитывал в сторону решения…а не на 3 буквы
45. пользователь 15.12.22 18:40
Сообщение было скрыто модератором.
...
46. aalu14 15.12.22 18:41 Сейчас в теме
43. starjevschik 15.12.22 18:39 Сейчас в теме
(40) это задача родственная например поиску цены товара на дату последней реализации. Но для ее осмысленного решения все же надо понимать, что такое запросы и как они устроены.
44. aalu14 15.12.22 18:40 Сейчас в теме
(43)спасибо за направление
47. пользователь 15.12.22 18:42
Сообщение было скрыто модератором.
...
48. aalu14 15.12.22 18:47 Сейчас в теме
(47)с головой подружитесь и читайте выше
user1881120; +1 Ответить
49. пользователь 15.12.22 18:48
Сообщение было скрыто модератором.
...
50. aalu14 15.12.22 18:49 Сейчас в теме
(49)жесть, вам заняться нечем
51. пользователь 15.12.22 18:50
Сообщение было скрыто модератором.
...
52. aalu14 15.12.22 18:55 Сейчас в теме
53. пользователь 15.12.22 18:57
Сообщение было скрыто модератором.
...
54. aalu14 15.12.22 19:12 Сейчас в теме
(53)не мог я промахнуться со столь специфичной персоной!
55. пользователь 15.12.22 19:14
Сообщение было скрыто модератором.
...
56. soft_wind 16.12.22 10:31 Сейчас в теме
(30) попробуйте такой запрос,
(потом можете вставить его в СКД-отчет и сгруппировать по полю Объект, будет вообще красиво)
//РегистрСведений.Активность, поля: дата, объект, автор, реквизит, значение.
//формируем таблицу только с записями "Исходящий звонок" 
Выбрать
	рег.*
поместить втТаб
из
РегистрСведений.Активность рег
где
	рег.Реквизит = "Исходящий звонок" 
;

//результирующая выборка
//1.сами строчки с "Исходящий звонок" 
Выбрать
втТаб.*
из втТаб

Объединить все

//2. дополнительные строчки с "" и интевалом 5 мин (= 300 сек) 
Выбрать
	рег.*
из
	втТаб
внутреннее соединение РегистрСведений.Активность рег
по втТаб.объект = Рег.объект //связь по объекту
	и Рег.Реквизит = "" //по условию что Реквизит = ""
	и РазностьДат(втТаб.Дата, рег.Дата, Секунда) <= 300 //и попадающие в 5 минут

упорядочить по
Объект, Дата
	
	
Показать
57. aalu14 16.12.22 10:54 Сейчас в теме
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)