Нумерация строк в запросе методами платформы

0. 61 09.01.20 10:50 Сейчас в теме
Простая реализация с помощью встроенных методов. Пригодится тем, кому нужно пронумеровать запрос без СКД и переборов.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. lmnlmn 64 09.01.20 11:05 Сейчас в теме
Вообще пронумеровать строки в запросе быстрее программно при его выводе. Данная функция облегчает жизнь при сложной обработке данных во временных таблицах. Теперь можно избавиться от сложных связей с ВТ. Еще стоит упомянуть что сия радость доступна с версии платформы 8.3.13.
Innuil; Созинов; Darklight; _7445_; sasha777666; Wilka; solary; mai_k; MsDjuice; SergeRSA; sulfur17; brr; marku; alex-l19041; +14 Ответить
2. Miracle777999111 09.01.20 11:10 Сейчас в теме
спасибо за статью, вроде мелочь но приятная =)
3. pavel_pss 272 09.01.20 11:15 Сейчас в теме
4. Dream_kz 113 09.01.20 12:38 Сейчас в теме
Её можно использовать только в виртуальных таблицах

временных
sasha777666; +1 Ответить
5. s22 19 09.01.20 13:53 Сейчас в теме
Фигня.
АВТОНОМЕРЗАПИСИ начинаеться не с 1, а с произвольного числа.
для АВТОНОМЕРЗАПИСИ гарантируеться только то, что следующее будет больше предыдущего. Не более
kalyaka; khvolkova; tps_01; sasha777666; BigB; harmer; +6 Ответить
9. Espiritfor 10.01.20 13:11 Сейчас в теме
(5)Все там нормально с 1 начинается.
10. s22 19 10.01.20 13:29 Сейчас в теме
(9) сделайте в одном запросе несколько временных таблиц
Сделайте в одной транзакции несколько запросов.
13. Espiritfor 10.01.20 16:03 Сейчас в теме
(10)
ВЫБРАТЬ
	Номенклатура.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Склады.Код КАК Код,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабСклады
ИЗ
	Справочник.Склады КАК Склады
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТабСклады.Код КАК Код,
	ТабСклады.Номер КАК Номер
ИЗ
	ТабСклады КАК ТабСклады

УПОРЯДОЧИТЬ ПО
	Номер


Код	        Номер
00001	1
00002	2
00003	3
00004	4
00005	5
00006	6
00009	7
00010	8
00011	9
00012	10
00013	11
00014	12
00015	13
00016	14
00017	15
00018	16
00019	17
00020	18
00021	19
00100	20
00101	21
00102	22
00103	23
00104	24
00105	25
00106	26
00107	27
00108	28
Показать
14. s22 19 10.01.20 18:33 Сейчас в теме
просто ради прикола выполните несколько раз подряд запрос

ВЫБРАТЬ ПЕРВЫЕ 10
	Номенклатура.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
	Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ 
	ТабАртикулы.Артикул КАК Артикул,
	АВТОНОМЕРЗАПИСИ() КАК Номер,
	ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
	ТабАртикулы КАК ТабАртикулы
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТабАртикулы2.Артикул,
	ТабАртикулы2.Номер,
	ТабАртикулы2.Номер1
ИЗ
	ТабАртикулы2 КАК ТабАртикулы2
Показать



результат бывает и такой

Артикул Номер Номер1
31 31
32 32
33 33
34 34
00000005691 35 35
36 36
37 37
00000006383 38 38
39 39
40 40
16. Espiritfor 10.01.20 19:07 Сейчас в теме
(14)
ВЫБРАТЬ ПЕРВЫЕ 10
Номенклатура.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер
ПОМЕСТИТЬ ТабАртикулы
ИЗ
Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
ТабАртикулы.Артикул КАК Артикул,
АВТОНОМЕРЗАПИСИ() КАК Номер,
ТабАртикулы.Номер КАК Номер1
ПОМЕСТИТЬ ТабАртикулы2
ИЗ
ТабАртикулы КАК ТабАртикулы
;

////////////////////////////////////////////////////////////­­////////////////////
ВЫБРАТЬ
ТабАртикулы2.Артикул,
ТабАртикулы2.Номер,
ТабАртикулы2.Номер1
ИЗ
ТабАртикулы2 КАК ТабАртикулы2

Показать

(14)

Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.

Допускаю, что при определенных условиях может возникать подобная ситуация, но я бы лучше перепроверил где-нибудь еще, чтобы исключить глюк системы.
Проверял на 8.3.13.1865
17. s22 19 10.01.20 19:13 Сейчас в теме
(16)
Вы, конечно, не поверите, но ничего не меняется, выполняя ваш запрос N раз.

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

8.3.14.1779 postgres 9.6
19. Bassgood 1098 11.01.20 15:13 Сейчас в теме
(17)
8.3.14.1779 postgres 9.6

Могу предположить что дело в СУБД - попробуйте то же самое проделать на SQL Server
20. Espiritfor 13.01.20 07:50 Сейчас в теме
(19)На ИТС довольно забавное описание:
АВТОНОМЕРЗАПИСИ

Описание:

Функция предназначена для формирования поля с уникальным, последовательно возрастающим значением во временной таблице. Функцию можно использовать в том случае, если необходимо создать ключевое поле во временной таблице. Значение, сформированное этой функцией, будет уникально в пределах временной таблицы, при формировании которой использовалась функция. Начальное значение счетчика зависит от используемой СУБД и, в общем случае, может быть любым. Не гарантируется, что начальное значение счетчика будет равно 1 для любой временной таблицы.

Не поддерживается использование функции АВТОНОМЕРЗАПИСИ() в следующих случаях:

● в запросах, содержащих ОБЪЕДИНИТЬ на верхнем уровне,

● в запросах, которые не формируют временную таблицу,

● вне списка выборки,

● в выражениях языка запросов.
Показать
KUAvanesov; dvissarov5; Cyberhawk; Mahon83; igee12; SergeRSA; aspirin4eg; sulfur17; Bassgood; +9 Ответить
24. MsDjuice 104 14.01.20 16:41 Сейчас в теме
(17)После выполнения нужно удалять временную таблицу
25. s22 19 14.01.20 16:51 Сейчас в теме
(24) не помогает. Иногда даже в одном запросе нумерация идет по возрастанию.
15. s22 19 10.01.20 18:54 Сейчас в теме
6. aha_1 10.01.20 09:37 Сейчас в теме
Все, что из запроса переносится в программный код, априори замедляет работу системы. Возможности языка запросов развивать надо, если ресурсы для этого имеются, а не рассказывать про необходимость "читаемости кода".
7. lmnlmn 64 10.01.20 10:59 Сейчас в теме
(6) Ни разу не априори. Надо от задачи и объемов данных смотреть. В некоторых ситуациях программная обработка избавляет от перевалки кучи данных по временным таблицам и от выполнения длиннющих и сложных запросов. Надо здравым смыслом пользоваться.
denver069; min-max_pro; MsDjuice; kiruha; Alexx48; Артано; +6 Ответить
8. aha_1 10.01.20 11:21 Сейчас в теме
А в программном коде разве мы не те же данные/таблицы обрабатываем? Только средствами программного кода, а не языка запросов, из-за скудности последнего.
11. lmnlmn 64 10.01.20 13:35 Сейчас в теме
(8) Дело в том что из-за скудности языка запросов приходится гонять существенные объемы данных по временным таблицам и при этом всем строить весьма витиеватые запросы. В то время как при программной обработке можно обойтись меньшими выборками данных.
12. aha_1 10.01.20 14:47 Сейчас в теме
Мы с Вами говорим практически об одном и том же, акцентируя внимание на разные моменты. Вы абсолютно правы, что при нынешнем состоянии языка запросов программная обработка данных иногда предпочтительнее. Я лишь обращаю внимание на причину этой ситуации.
Bassgood; +1 Ответить
22. tamepjlah 2 14.01.20 07:21 Сейчас в теме
Вот объясните мне для чего нужен этот автономерзаписи, когда есть индекс строки? Для просмотра в консоле запросов? Уже сколько времени прошло, когда его ввели, а я так ни разу и не придумал ему применение...
23. lmnlmn 64 14.01.20 08:40 Сейчас в теме
Автономер записи удобно использовать как несоставной первичный ключ во временных таблицах. Это сильно упрощает связи в запросах с временными таблицами и снижает нагрузку на СУБД.
mvxyz; sergathome; +2 Ответить
26. MuxaH 17.01.20 06:39 Сейчас в теме
(23) Вот-вот, помнится мне, как я парился, чтоб создать уникальный ключ строки во временной таблице... А с этой штукой прям не жизнь , а сказка :) Даже и пофиг, что не с 1 может начинаться
sergathome; +1 Ответить
27. Vodoley 1 05.06.20 15:09 Сейчас в теме
(26) соглашусь. Но вот если нужно, чтобы записи нумеровались не произвольным образом а в порядке сортировки каких-то полей... то только "индексировать по" неявным образом приведет к нужному результату?
29. Darklight 27 31.08.20 16:08 Сейчас в теме
(27)Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.

Тут скорее полезность в том, что можно заранее вычислить временную таблицу с каким-то набором ключевых полей - и вот так в запросе её пронумеровать. А затем прилепить её к другим таблицам (по ключевым полям) и/или сделать из неё/них разные выборки (этот подход любят в типовом коде 1С) - а потом их соединять друг с другом - но уже не по ключевым полям - по вот такому полю-нумератору (мэппинг сложно-составного ключа к Числу - но надо делать заранее - и везде использовать готовый набор).

Конечно, прям вряд ли тут будет какой-то большой выигрыш в эффективности (производительности, нагрузки на память, легкочитаемости, хотя вот по модифицируемости - выигрыш может быть заметным), но для ряда очень сложных выборок, активно практикующих такие множественные соединения по одинаковым массивным ключам - может быть полезно!


Другое дело - что такая фишка открывает новые возможности, например с такой нумерацией гораздо проще написать алгоритмы устранения дублей, или сделать выборку, скажем, только чётных строк, или выбрать не только первые N, а наоборот, скажем, пропустить первые N записей, или выбрать, например из середины с M по N (правда с учётом, что нумерация может быть не с 0(1) а с произвольного числа такой код немного усложняется - но всё-таки не становится излишне запутанным!

Так же заметно упрощаются алгоритмы покадрового вычисления и вывода результатов запросов!
31. Vodoley 1 10.09.20 09:12 Сейчас в теме
(29)
Вы ещё функцию вычисления хеш-ключа по набору полей пожелайте.
Ну и, до кучи - функцию генерации UUID.

хеш мне пока был без надоности.. а вот почему к ID записей объектных таблиц нельзя обращаться в запросах?

насчет сортировки.. когда я комментил у меня была задача, когда надо было интеллектуально сопоставить множество заказов с множеством бонусов для этих заказов. Условно говоря у меня было 2 временных таблицы (сложным образом полученных). Сопоставляю все возможные сочетания записей между ними: нужно получить одну таблицу, в которой результат лучшего мэтчинга (например по минимуму скоринговой функции, вычисляемой по значениям некоторых полей обеих таблиц). Автонумерация (в каждой из сопоставляемых таблиц) здорово помогает, когда скоринговая функция (как бы ее не мудрить) принимает одинаковые значения для разных мэтчингов - тогда можно сделать такое расщепление- при прочих равных кто-то будет предпочтен, благодаря включению в эту функцию автономера... Но вот если бы этот номер был в свою очередь проставлен не произвольно, а в нужном порядке это бы улучшило результат )
Полагаю диалект MSSQL (хотя более глубокое знание SQL у меня еще впереди ))

В любом случае запросом такие штуки сложновато решать, т.к. не учитываются сложности взаимодействия между записями: каждая запись одной таблы мэтчится с записями другой независимо - а ведь выбор одной из возможностей изменяет множество доступной для сопоставления оставшимся.. Т.е. по хорошему такой выбор не сделать (предполагаю) реляционной алгеброй... (ну пришлось там пост обработкой запроса дотачивать).
32. Darklight 27 10.09.20 11:40 Сейчас в теме
(31)Вашу задачу из вашего описания понять очень сложно. Как я написал выше, атонумерацию как ключ сопоставления можно эффективно использовать - если эти ключи-номера рассчитаны единожды во временной таблице - и эта временна таблица далее либо соединяется (по полным ключам) к другим таблицам, либо из уже делаются все остальные выборкии подвыборким, которые далее уже соединяются между собой. Вот именно все дальнейшие соединения уже можно сделать но нумерованному ключу, но генерировать его нужно только в одной верхней выборке!
33. Vodoley 1 10.09.20 17:06 Сейчас в теме
(32) но если бы была возможность нумеровать не в произвольном порядке (ведь сейчас непредсказуемо какая запись получить меньший автономер а какая больший) то кроме уникальности записей появляется возможность их ранжировать (во временных таблицах), если такое ранжирование нужно. Кажется если сделать индексацию (по полям) то записи (в ВТ) будут пронумерованы в порядке этих индексов )
34. Darklight 27 10.09.20 17:20 Сейчас в теме
(33)Вот, честно, не могу понять, что за управляемую нумерацию Вы хотите. Автонумерация - это просто нумерация. Если Вы хотите управлять номером - конструкции "ВЫБОР", "ГДЕ", "ПЕРВЫЕ" и "УПОРЯДОЧИТЬ", а грегатные к Вашим услугам. Просто ранжирование - это применение некой функции-условия - вот её Вы должны написать сами. И не понимаю, как бы вы применяли "Автонумерацию", если бы она всегда начиналась с 0 (она и так автоупорялоченна согласно сортировки), кроме того что я уже выше написал - с единомоментной нумерацией, и а весь функционал дальше уже оформляется поствыборками!
35. Vodoley 1 11.09.20 08:40 Сейчас в теме
(34) неважно с нуля или не с нуля - я о том, чтобы сначала выстроить записи в определенном порядке (во временной таблице) и потом их в этом же порядке пронумеровать.
неявным образом помогает индексировать.
36. Darklight 27 11.09.20 09:37 Сейчас в теме
(35)Я вас не понимаю. Автонумерация во одной временной таблице идёт от N до M (где M > N) - без пропусков, в строгом порядке сортировки - в чём затык?
37. Vodoley 1 11.09.20 14:00 Сейчас в теме
(36)во временной таблице нет никакой сортировки. (в смысле оператор "упорядочить" отсутствует во временных таблицах.
Неявным образом применение индексирования упорядочивает записи (но это не гарантируется) и оператор Автономер - сработает _до_ индексирования. Т.е. нужно сначала ВТ индексировать, а потом в следующем запросе пакета из этой индексированной таблицы уже запросить и сделать автономер. (но опят же это все не гарантирует результат)
38. Darklight 27 11.09.20 14:57 Сейчас в теме
(37), Да "УПОРЯДОЧИТЬ ПО" нельзя применить во временной таблице без ключевого слова "ПЕРВЫЕ", но кто Вам мешает сделать вот так

ВЫБРАТЬ ПЕРВЫЕ 10000000000000000
	Номенклатура.Ссылка,
	Номенклатура.Код КАК Код,
	АВТОНОМЕРЗАПИСИ() КАК Автономер
ПОМЕСТИТЬ тз
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Код > "00000000005"
	И Номенклатура.Код < "000000066"

УПОРЯДОЧИТЬ ПО
	Код
Показать


Этот код у меня в базе (на MS SQL, PG, Oracle нет сейчас под рукой) отбирает только 10 записей - согласно условию отбора - и присваивает им номера от 1 до 10 согласно заданной сортировке по Коду
Созинов; +1 Ответить
39. Vodoley 1 15.09.20 14:33 Сейчас в теме
28. Serj1C 480 10.07.20 13:18 Сейчас в теме
С какой версии платформы доступно?
30. Darklight 27 31.08.20 16:10 Сейчас в теме
(28)В (1) посте указана версия 8.3.13 - причём, судя по всему, платформы, а не версия совместимости конфигурации (у меня на платформе 8.3.15 в конфигурации с версией совместимости 8.3.5 эта функция заработала)
40. KindLion 24.11.20 14:19 Сейчас в теме
Спасибо!
Век живи - век учись! :)
41. Qarasique 20.02.21 13:26 Сейчас в теме
Если у вас номер строки начинается не с единицы:

ВЫБРАТЬ
	АВТОНОМЕРЗАПИСИ() КАК НомерСтроки,
	СправочникНоменклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВТ_Данные
ИЗ
	Справочник.Номенклатура КАК СправочникНоменклатура
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МИНИМУМ(Данные.НомерСтроки) КАК МинимальныйНомерСтроки
ПОМЕСТИТЬ ВТ_МинимальныйНомерСтроки
ИЗ
	ВТ_Данные КАК Данные
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Данные.НомерСтроки - ВТ_МинимальныйНомерСтроки.МинимальныйНомерСтроки + 1 КАК НомерСтроки,
	Данные.Номенклатура КАК Номенклатура
ИЗ
	ВТ_Данные КАК Данные,
	ВТ_МинимальныйНомерСтроки КАК ВТ_МинимальныйНомерСтроки
Показать
Оставьте свое сообщение
Вопросы с вознаграждением