Я хочу найти первый «пробел» в столбце счетчика в таблице SQL. Например, если есть значения 1,2,4 и 5, я бы хотел узнать 3.
Я, конечно, могу привести значения в порядок и просмотреть их вручную, но я хотел бы знать, есть ли способ сделать это в SQL.
Кроме того, это должен быть вполне стандартный SQL, работающий с разными СУБД.
sql
gaps-and-islands
Токо
источник
источник
LAG(id, 1, null)
функцию withOVER (ORDER BY id)
clause.Ответы:
В
MySQL
иPostgreSQL
:В
SQL Server
:В
Oracle
:ANSI
(работает везде, наименее эффективно):Системы, поддерживающие функции раздвижного окна:
источник
URL
, хотя я думаю, что это может быть QR-код.[1, 2, 11, 12]
, то нашел бы только это3
. Вместо этого я бы хотел найти 3-10 - в основном, начало и конец каждого пробела. Я понимаю, что мне, возможно, придется написать свой собственный скрипт python, который использует SQL (в моем случае MySql), но было бы неплохо, если бы SQL мог приблизить меня к тому, что я хочу (у меня есть таблица с 2 миллионами строк, в которых есть пробелы, поэтому мне нужно будет разрезать его на более мелкие части и запустить на нем некоторый SQL). Полагаю, я мог бы запустить один запрос, чтобы найти начало промежутка, затем другой, чтобы найти конец промежутка, и они «сортируют слияние» двух последовательностей.NULL
, нет0
, если таблица пуста. Это верно для всех баз данных.Все ваши ответы работают нормально, если у вас есть первое значение id = 1, иначе этот пробел не будет обнаружен. Например, если значения идентификатора вашей таблицы 3,4,5, ваши запросы вернут 6.
Я сделал что-то вроде этого
источник
На самом деле нет чрезвычайно стандартного способа SQL для этого, но с некоторой формой ограничивающего предложения вы можете сделать
(MySQL, PostgreSQL)
или
(SQL Server)
или
(Оракул)
источник
Первое, что пришло мне в голову. Не уверен, что это вообще хорошая идея, но должно сработать. Предположим, что таблица
t
и столбецc
:Изменить: это может быть быстрее (и короче!):
источник
LEFT OUTER JOING t2
вам потребуетсяt2
таблица, которая является просто псевдонимом.Это работает в SQL Server - не может протестировать его в других системах, но кажется стандартным ...
Вы также можете добавить начальную точку к предложению where ...
Итак, если у вас были 2000, 2001, 2002 и 2005 годы, а 2003 и 2004 не существовали, он вернет 2003.
источник
Следующее решение:
Последовательно нумерует упорядоченные строки в предложении « with », а затем повторно использует результат дважды с внутренним соединением по номеру строки, но смещением на 1, чтобы сравнить предыдущую строку со строкой после, ища идентификаторы с пробелом больше 1. Больше, чем просили, но более широко применимо.
Внутренний запрос производит:
Внешний запрос производит:
источник
Внутреннее присоединение к представлению или последовательности, имеющей все возможные значения.
Нет стола? Сделайте стол. Я всегда держу пустышку только для этого.
Затем,
источник
Для
PostgreSQL
Пример использования рекурсивного запроса.
Это может быть полезно, если вы хотите найти пробел в определенном диапазоне (он будет работать, даже если таблица пуста, тогда как другие примеры не будут)
источник
Моя догадка:
источник
Это объясняет все, о чем говорилось до сих пор. Он включает 0 в качестве начальной точки, которая будет использоваться по умолчанию, если также не существует никаких значений. Я также добавил соответствующие места для других частей многозначного ключа. Это было проверено только на SQL Server.
источник
Я написал быстрый способ сделать это. Не уверен, что это самый эффективный вариант, но выполняет свою работу. Обратите внимание, что он не сообщает вам пробел, но сообщает идентификатор до и после пробела (имейте в виду, что пробел может быть несколькими значениями, например 1,2,4,7,11 и т. Д.)
Я использую sqlite в качестве примера
Если это ваша структура таблицы
и это твои строки
Запрос
https://gist.github.com/wkimeria/7787ffe84d1c54216f1b320996b17b7e
источник
источник
Вот стандартное решение SQL, которое работает на всех серверах баз данных без изменений:
Смотрите в действии для;
источник
Он также работает для пустых таблиц или с отрицательными значениями. Только что протестировано в SQL Server 2012
источник
Если вы используете Firebird 3, это будет наиболее элегантно и просто:
источник
источник
Обнаружено, что большинство подходов выполняются очень и очень медленно
Я предполагаю, что последовательность начинается с «1».mysql
. Вот мое решение дляmysql < 8.0
. Проверено на 1 млн записей с разрывом в конце ~ 1 секунда до конца. Не уверен, подходит ли он другим вариантам SQL.источник
Если ваш счетчик начинается с 1 и вы хотите сгенерировать первый номер последовательности (1), когда он пуст, вот исправленный фрагмент кода из первого ответа, действительного для Oracle:
источник
источник
Если числа в столбце являются положительными целыми числами (начиная с 1), то вот как легко решить эту проблему. (при условии, что ID - это имя вашего столбца)
источник