найти последние записи из удовлетворяющих какому-то условию

1. dimao 12.07.21 15:13 Сейчас в теме
Добрый день.
Точно не понял как коротко сформулировать :-)
есть записи вида:

1-да
2-да
3-нет
4-нет
5-нет
6-да
7-нет
8-да
9-да

можно ли запросом получить записи 2,6,9. То есть последние из последовательностей "ДА" ? или это только последовательным перебором решается?

напрашивается сделать так:

1-да - пусто
2-да 1-да
3-нет 2-да
4-нет 3-нет
5-нет 4-нет
6-да 5-нет
7-нет 6-да
8-да 7-нет
9-да 8-да
пусто - 9-да

и найти все, у которых "нет-да" и последнюю, если "-- да", но ключик записи нерегулярный - дата

помогите разобраться

ЗЫ: кстати, пришло в голову соединить табличку с объединением ее с пустой записью. как раз получается как в моем примере! Если получится - напишу
Найденные решения
12. -AI- 12.07.21 16:30 Сейчас в теме
подкину дровишек....

задачу придумал с потолка.....
ВЫБРАТЬ ПЕРВЫЕ 1000000
	АВТОНОМЕРЗАПИСИ() КАК Номер,
	Период, Курс
ПОМЕСТИТЬ ПронумерованнаяТаблица
ИЗ РегистрСведений.КурсыВалют
ГДЕ Валюта.Наименование = "USD"
УПОРЯДОЧИТЬ ПО Период УБЫВ
ИНДЕКСИРОВАТЬ ПО Номер
;
ВЫБРАТЬ
	таб.Период,
	таб.Курс,
	таб.Курс-табПред.Курс КАК Взлёт,
	табПред.Период КАК предПериод,
	табПред.Курс КАК предКурс
ИЗ
	ПронумерованнаяТаблица КАК таб
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	ПронумерованнаяТаблица КАК табПред
		ПО таб.Номер=табПред.Номер-1
ГДЕ
	таб.Курс-табПред.Курс>2
Показать
нужно найти "взлёт" курса больше 2х рублей между соседними "чекпоинтами"

PS просто пример как можно работать с "чекпоинтами", правда не совсем "документированный".... ("не легитимный")

PPS АВТОНОМЕРЗАПИСИ() появился в 8.3.14
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. FatPanzer 12.07.21 15:43 Сейчас в теме
(1)
можно ли запросом получить записи 2,6,9. То есть последние из последовательностей "ДА" ?
1. В вашем примере строка 6 не удовлетворяет условию.
2. Запрос не умеет анализировать последовательности значений.

Тут либо предварительная обработка ТЗ перед запросом, либо вообще без запроса перебор.
2. daenur1301 12.07.21 15:27 Сейчас в теме
Как-то уж очень абстрактно и непонятно, поконкретней пожалуйста, раз уж ссылаетесь на БП 3.0
4. dimao 12.07.21 15:37 Сейчас в теме
(2)
ну тут самописный костыль

табличка в которой информация по взаиморасчетам по договорам;

ссылка на документ - дата - размер просрочки оплаты (в днях)

каждая новая запись кумулятивно отражает просрочку оплаты. То есть, если просрочка продолжается на протяжении нескольких "чекпоинтов" то актуальная просрочка только в последней записи перед отсутствием просрочки (когда оплата внесена в срок и полностью). вот ее и нужно находить
6. daenur1301 12.07.21 15:49 Сейчас в теме
(4) Интересная задачка... а эта табличка как реализована? регистр сведений? периодический, подчиненный регистратору?
8. dimao 12.07.21 15:53 Сейчас в теме
(6)нет, это псевдо-документы, которые приходят из внешней системы.
15. daenur1301 12.07.21 16:42 Сейчас в теме
(4) Если записи таблицы расположены в хронологическом порядке, то можно пронумеровать строки при помещении этой таблицы во временную в запросе, и тогда можно соединить таблицу саму с собой по условию что номер слева больше номера справа и затем сгруппировать используя максимум номера справа, тогда у вас будет номер записи и текущий и предыдущий.. затем снова соединяете по номеру предыдущей записи и получите долг и текущий и предыдущей записи.

Но если хронологии нет, то по дата это сделать не выйдет, может повторяться значение.
3. soft_wind 12.07.21 15:28 Сейчас в теме
очччч, похоже на работу с интервалами, покопайте там
7. dimao 12.07.21 15:52 Сейчас в теме
(5)почему не удовлетворяет? 6-6вырожденная до одной записи последовательность. Она - начало и конец.
я попробую связать
10. FatPanzer 12.07.21 16:00 Сейчас в теме
(7) Ок, дерзайте. Получится только если:
а) есть набор уникальных ключей
б) есть ключ, по которому можно однозначно хронологически отсортировать вышеупомянутый набор (сам хронологический ключ тоже входит в набор уникальных ключей)

И только потом можно
а) накладывать условия на все НЕхронологические ключи, и получать максимальное агрегатное значение хронологического ключа.
б) связывать получившиеся строки с первоначально таблицей по ВСЕМ ключам для получения детальных строк.

Технология такая же, как и получение множественного среза последних.
9. starjevschik 12.07.21 15:59 Сейчас в теме
я подозреваю что запросом это вряд ли, а СКД умеет понимать предыдущую запись и там можно условие сделать типа "если следующая не равна текущей то".
11. МихаилМ 12.07.21 16:06 Сейчас в теме
можно. ищите "зарос тета соединение". у ильдаровича в минимализмах есть пример похожего запроса
16. МихаилМ 12.07.21 17:02 Сейчас в теме
17. -AI- 12.07.21 18:12 Сейчас в теме
(16) круть...
более правильный вариант (по сравнению с АвтоНомерЗаписи):
ВЫБРАТЬ
	т1.Период,
	т1.Курс,
	т2.Курс-т1.Курс КАК Взлёт,
	т2.Период КАК предПериод,
	т2.Курс КАК предКурс
ИЗ
	РегистрСведений.КурсыВалют КАК т1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	(ВЫБРАТЬ
		т1.Период КАК Период1,
		МИНИМУМ(т2.Период) КАК Период2
	ИЗ	РегистрСведений.КурсыВалют КАК т1
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ
		РегистрСведений.КурсыВалют КАК т2
			ПО т2.Валюта=т1.Валюта
			 И т2.Период>т1.Период
	ГДЕ т1.Валюта.Наименование = "USD"
	СГРУППИРОВАТЬ ПО т1.Период) КАК Связка
			ПО Связка.Период1=т1.Период
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	РегистрСведений.КурсыВалют КАК т2
			ПО т2.Период=Связка.Период2
			 И т2.Валюта=т1.Валюта
			 И т2.Курс-т1.Курс>2
ГДЕ т1.Валюта.Наименование = "USD"
УПОРЯДОЧИТЬ ПО т1.Период
Показать
12. -AI- 12.07.21 16:30 Сейчас в теме
подкину дровишек....

задачу придумал с потолка.....
ВЫБРАТЬ ПЕРВЫЕ 1000000
	АВТОНОМЕРЗАПИСИ() КАК Номер,
	Период, Курс
ПОМЕСТИТЬ ПронумерованнаяТаблица
ИЗ РегистрСведений.КурсыВалют
ГДЕ Валюта.Наименование = "USD"
УПОРЯДОЧИТЬ ПО Период УБЫВ
ИНДЕКСИРОВАТЬ ПО Номер
;
ВЫБРАТЬ
	таб.Период,
	таб.Курс,
	таб.Курс-табПред.Курс КАК Взлёт,
	табПред.Период КАК предПериод,
	табПред.Курс КАК предКурс
ИЗ
	ПронумерованнаяТаблица КАК таб
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ
	ПронумерованнаяТаблица КАК табПред
		ПО таб.Номер=табПред.Номер-1
ГДЕ
	таб.Курс-табПред.Курс>2
Показать
нужно найти "взлёт" курса больше 2х рублей между соседними "чекпоинтами"

PS просто пример как можно работать с "чекпоинтами", правда не совсем "документированный".... ("не легитимный")

PPS АВТОНОМЕРЗАПИСИ() появился в 8.3.14
13. dimao 12.07.21 16:37 Сейчас в теме
(12)только что сам читал про автономер! очень полезно
14. -AI- 12.07.21 16:41 Сейчас в теме
(13)
только что сам читал про автономер

ага, сам только сегодня на него наткнулся...
(люблю по утрам, вместо советских газет, почитать changelog того с чем работаю)

PS в 8.3.20 в запросы добавили функции работы со строками:
Строка(), ДлинаСтроки(), СокрЛ(), СокрП(), СокрЛП(), Лев(), Прав(), СтрНайти(), СтрЗаменить(), ВРег(), НРег()
и тригонометрические функции:
Sin(), Cos(), Tan(), ASin(), ACos(), ATan(), Exp(), Log(), Log10(), Pow(), Sqrt(),
и некоторые другие:
Окр(), Цел(), ДлинаСтроки()

начал читать подробности (документацию), а там наткнулся и на АвтоНомерЗаписи()
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот