|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Есть таблица с семизначными штрих-кодами, все они начинаются на 13ххххх. Проблема в том, что они не последовательны (а даже очень хаотичны) и есть коды типа 1300002, 1399999, что не позволяет использовать min()/max() этого поля, чтобы просто последовательно выбирать новое значение для штрих-кода. Ещё более неприятная штука, что в системе используется интерпретатор SQL, который не позволяет использовать конструкции типа with, for xml path, а также процедуры, к тому же этот интерпретатор разбивает скрипт на одиночные запросы, так что временные переменные и таблицы тоже не будут работать. Пока что единственный вариант, который пришёл мне в голову - это создать временную таблицу "foo" со значениями от 0 до 99999 и джоинить на неё таблицу штрихкодов: Код: sql 1. 2. 3. 4. 5.
Ребят, может есть какое-то более нормальное решение, не требующее таблицу с нумераторами? Просто я не представляю себе, как сделать "select ROW_NUMBER() over таблица_с_полямы_которых_нет" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 19:30 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 19:59 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
invm, спасибо, но это не совсем то. Ваш код возвращает существующий в таблице Items штрих-код, проверил через менеджмент студию, нужен же наоборот - певый из не существующих. Ещё одна проблема - каличный интерпретатор отругался на функцию lead(), похоже он её не понимает (что странно, row_number() он позволяет). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 20:30 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
vdix нужен же наоборот - певый из не существующих. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 20:34 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
vdix ... Ещё одна проблема - каличный интерпретатор отругался на функцию lead(), похоже он её не понимает (что странно, row_number() он позволяет). lead & lag появились в версии 2012, а row_number() - с ms sql 2005. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 08:41 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
vdix Ещё одна проблема - каличный интерпретатор отругался на функцию lead(), похоже он её не понимает (что странно, row_number() он позволяет). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 09:45 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5.
Одна проблема - запрос ищет именно дыру. Если отсутствует одно или несколько значений в начале диапазона - запрос не вернёт 1300000... а UNION-ить к таблице запись с 1299999 как-то некрасиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 10:03 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
vdix, К "проблеме - калечный интерпретатор" можно добавить проблему калечной постановки задачи. Я бы еще добавил условие «сначала найти самую длинную "дырку"». Вдруг потребуется ну очень большой диапазон штрих-кодов, а найденной "дырки" не хватит. Сегодня штрих-коды выстроены в непрерывную последовательность. Через некоторое время освободившиеся штрих-коды снова дадут "дырки". Это вечная тяга к наведению порядка в множестве. Хотя, достаточно просто использовать первый попавшийся свободный штрих-код. Решение с опорной таблицей вполне приемлемо. Желательно, чтобы эта таблица была постоянной. Совсем не обязательно, чтобы там были числа. Запишите в нее строки от '1300000' до '1399999' и все преобразования станут лишними; лишний и isnull в секции where. Кроме left join есть еще exists. Для вывода одной строки используется top(1). Тем более, что используется «интерпретатор SQL, который не позволяет использовать конструкции типа ...». Кстати, для внутренних потребностей штрих-код должен начинаться с 2-ки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 15:09 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Wlr-l, Это сколько же там штрих кодов, что они не влезают в INT, а может и BIGINT уже не хватает? Все астероиды во вселенной решили промаркеровать что-ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 15:17 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
a_voronin Wlr-l, Это сколько же там штрих кодов, что они не влезают в INT, а может и BIGINT уже не хватает? Все астероиды во вселенной решили промаркеровать что-ли? 1399999 - 1300000 = 99999 вариантов ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 15:29 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Какой-то такой олдскул Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Или вместо скаляров, так сделать? Что автор ожидает, если начало интервала совпадает с окончанием интервала выбора минимала? Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 16:10 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Wlr-l vdix, К "проблеме - калечный интерпретатор" можно добавить проблему калечной постановки задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 16:13 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Как все сложно, хотя эта именно эта задача имеет простое решение: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Если запустить скрипт как есть, то получим 1300002. Штрих код из середины диапазона. Закоментируем строку 1 и раскоментируем строку 2 запроса items. Получим 1300000. Штрих код, совпадающий с началом диапазона. Закоментируем строку 1 запроса foo; закоментируем строку 2 и раскоментируем строку 3 запроса items. Получим пустую строку, т.е. все штрих-коды уже используются. Если очень хочется определенности, то к top можно добавить order by. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 17:13 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Wlr-l, в том-то и дело, что так потребуется сгенерировать таблицу на 100к записей на лету, т.к. судя по сообщениям ТС хранить такую таблицу возможности нет. Выше привели лучший вариант с lead, но, т.к. данную функцию интерпретатор не поддерживает, остались варианты с top и cross apply, и ещё один вариант, более сложный для понимания, но не требующий подзапросов и самосоединений привел я. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 18:01 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Всем огромное спасибо за помощь! Akina, Ваше решение подходит идеально, благодарю :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 18:15 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
nullin, если ваш интерпретатор разрешает табличные функции, допилите фунукию для генерирования int/bigint последовательностей от до: быстрая тут, от invm dbo.fnSequentialNumbers: Повторить строку N раз ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 18:23 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
nullin Wlr-l, в том-то и дело, что так потребуется сгенерировать таблицу на 100к записей на лету, т.к. судя по сообщениям ТС хранить такую таблицу возможности нет. Выше привели лучший вариант с lead, но, т.к. данную функцию интерпретатор не поддерживает, остались варианты с top и cross apply, и ещё один вариант, более сложный для понимания, но не требующий подзапросов и самосоединений привел я. 1.ТС нашел решение: "единственный вариант, который пришёл мне в голову - это создать временную таблицу "foo" со значениями от 0 до 99999". Следовательно, опорную таблицу можно хранить и его интерпретатор справляется с его запросом. 2.Опорную таблицу не обязательно хранить в этой же БД, можно хранить в соседней, которая используется только для чтения. 3.Я всего лишь очистил решение ТС от хлама. 4.У Вас странное понимание подзапросов и самосоединений . Посмотрите внимательно на свой запрос и попробуйте понять, что он требует и чего не требует. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 18:26 |
|
Определить минимальное отсутствующее значение в таблице
|
|||
---|---|---|---|
#18+
Wlr-l, мой запрос, как я и предполагал, более сложный для понимания первое что делает, так это под капотом осуществляет функцию lead над множеством без самосоединений. Дальше когда пошли толкования, что-же хотел ТС, после того, как ему не пошло min(t.barcode) по where cast(t.barcode_next as int) > cast(t.barcode as int) + 1, пришлось усложнить, и, добавлю, declare в моем запросе тоже не нужны, это скорее для тестов - ТС свои коды от 1.3кк вообще хардкодит и вообще даже не понятно, в чем они хранятся Alexander Us nullin, если ваш интерпретатор разрешает табличные функции ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 19:09 |
|
|
start [/forum/topic.php?fid=46&msg=39933572&tid=1686390]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 466ms |
0 / 0 |