|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Имеется таблица Test Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
с такими данными: NumberState112030415160718191100 И необходимо получить минимальный Number с которого начинается непрерывная числовая последовательность длиной 3. Последовательность считается непрерывной, если для всех значений в Number поле State=1. В данном примере это Number=7. Количество данных может быть существенно больше 10 и длина последовательности тоже может быть любой. И вот как это сделать через SQL не пойму. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.01.2021, 23:38 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Этого никто не может понять. Не решают такие задачи в базах данных. Ну или решают на уровне триггеров и вторичных таблиц. Когда в основную таблицу приходит запись - триггер проверяет "сейчас мы набираем последовательность нулей/единиц" и либо создает новую запись в таблице регистрации последовательностей, либо обновляет счетчик в последней записи этой таблицы. А на существующей таблице... Ну проще всего это сделать в цикле снаружи: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 06:02 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Кодом я и так это решил, но мне необходимо решение через SQL. Попробую перефразировать вопрос на примере. Допустим у нас есть железнодорожный состав из 10 вагонов и есть груз разного типа, который необходимо максимально компактно распределить. Вот я и хочу получить из состава свободную секцию из 3-х вагонов, под груз водки, а потом мне потребуется секция из двух вагонов под груз селедки и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 13:07 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
SQL-ем это не решается, т.к. с точки зрения теории реляционных БД нет такого понятия как порядок получения записей, нет ни первой, ни последней, все записи равнозначны и выбираться могут в любом порядке. Отсортировать можно только результат выборки, а во время выборки записи могут браться в любом порядке. Вывод: нельзя сравнивать соседние записи. В твоем случает надо решать задачу алгоритмически или кардинально менять структуру БД, чтобы в одной записи хранился диапазон номеров. Но если очень хочется решить задачу "выбрать 3 номера подряд", то есть изврат: Код: sql 1. 2. 3.
Повторюсь, это изврат. так писать не советую. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 13:45 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Страдалецъ Кодом я и так это решил, но мне необходимо решение через SQL. Попробую перефразировать вопрос на примере. Допустим у нас есть железнодорожный состав из 10 вагонов и есть груз разного типа, который необходимо максимально компактно распределить. Вот я и хочу получить из состава свободную секцию из 3-х вагонов, под груз водки, а потом мне потребуется секция из двух вагонов под груз селедки и т.д. Это задача о рюкзаке , ее средствами SQL не решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 13:48 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Страдалецъ Вот я и хочу получить из состава свободную секцию из 3-х вагонов. так пронумеруйте вашу последовательность 3 раза с интервалом +1... а потом сделайте self-join этих 3х таблиц по номеру - получите 3 столбца последовательных вагонов... и отберите по Where пустой вагон во всех 3х столбцах ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 16:32 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
SQLite умеет в аналитические функции как и Oracle, а там задача поиска start of group труда не составляет Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
если не нужно динамически определять максимальную последовательность можно убрать один уровень вложенности ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 16:39 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Оптимизируем Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 16:54 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Вот использование оконных функций я и предполагал, но опыта их использования нет вообще. Спасибо, сейчас попробуем. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 17:08 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Dima T Страдалецъ Кодом я и так это решил, но мне необходимо решение через SQL. Попробую перефразировать вопрос на примере. Допустим у нас есть железнодорожный состав из 10 вагонов и есть груз разного типа, который необходимо максимально компактно распределить. Вот я и хочу получить из состава свободную секцию из 3-х вагонов, под груз водки, а потом мне потребуется секция из двух вагонов под груз селедки и т.д. Это задача о рюкзаке , ее средствами SQL не решить. Правда, только с использованием процедурных расширений. Делал я как-то жадный вариант решения на WatcomSQL, исходник хранимой процедуры получился в 80 килобайт... И да, за неимением процедур, на SQLite это впрямую повторить не получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 17:13 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
MazoHist почти то что надо! Но не находит первую группу если выставить в примере для второй записи значение State=1. Выдает первый элемент из второй группы. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 17:22 |
|
Выбрать из последовательности ближайший, непрерывный интервал размером не меньше чем N
|
|||
---|---|---|---|
#18+
Стоп, был не прав. Все работает. Это подключился через DBeaver, а там оказывается надо отдельно подтверждать сохранение данных. Пока не стал по шагам проверять результаты, не видел этого косяка. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.01.2021, 19:14 |
|
|
start [/forum/topic.php?fid=54&tid=2008340]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
26ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 245ms |
total: | 362ms |
0 / 0 |