Как сделать выборку по отсутствующим значениям
От: Аноним  
Дата: 07.02.03 08:24
Оценка:
Если есть последовательность данных
типа
1
2
3
5

6
7
8
10
Как сделать выборку, результатом которой будет
набор записей пропущенных из последовательности.
Т.е
4
9
Re: Как сделать выборку по отсутствующим значениям
От: Lexey Россия  
Дата: 07.02.03 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если есть последовательность данных

А>типа
А>1
А>2
А>3
А>5
А>6
А>7
А>8
А>10
А>Как сделать выборку, результатом которой будет
А>набор записей пропущенных из последовательности.
А>Т.е
А>4
А>9

AFAIK, нет таких средств. Нужно как-то извращаться. Что у тебя за база?
А вообще, наверное правильнее такое делать не клиенте — получать отсортированный список всех записей, смотреть min/max и самому находить дырки — незачем сервер идиотской работой понапрасну нагружать.
Re[2]: Как сделать выборку по отсутствующим значениям
От: Lynxin Россия  
Дата: 07.02.03 09:36
Оценка:
Здравствуйте, Lexey, Вы писали:

Зависит от последвательности, да и много от чего... Если не жалко места, то создай табличку с правильной последовательностью и выбирай себе "Where myField Not In....". Не экономно, но продуктивно!
L>AFAIK, нет таких средств. Нужно как-то извращаться. Что у тебя за база?
L>А вообще, наверное правильнее такое делать не клиенте — получать отсортированный список всех записей, смотреть min/max и самому находить дырки — незачем сервер идиотской работой понапрасну нагружать.
Re[3]: Как сделать выборку по отсутствующим значениям
От: Lexey Россия  
Дата: 07.02.03 09:40
Оценка:
Здравствуйте, Lynxin, Вы писали:

L>Здравствуйте, Lexey, Вы писали:


L>Зависит от последвательности, да и много от чего... Если не жалко места, то создай табличку с правильной последовательностью и выбирай себе "Where myField Not In....". Не экономно, но продуктивно!


В общем-то, именно это я имел в виду под "извращаться".
Иногда такую табличку можно и в процедуре генерировать.
Re: Как сделать выборку по отсутствующим значениям
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.02.03 09:42
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Если есть последовательность данных

А>типа
А>1
А>2
А>3
А>5
А>6
А>7
А>8
А>10
А>Как сделать выборку, результатом которой будет
А>набор записей пропущенных из последовательности.
Из какой последовательности?
Если есть последовательность SequenceA.ID и SequenceB.ID, то вычитание множеств делается так:
select * from SequenceA where SequenceA.ID not in (select ID from SequenceB)

А>Т.е
А>4
А>9
Неправильно. Если это был инт, то пропущены 0,4,9, 11..4294967295.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Как сделать выборку по отсутствующим значениям
От: Lynxin Россия  
Дата: 07.02.03 09:43
Оценка:
L>>Здравствуйте, Lexey, Вы писали:
L>В общем-то, именно это я имел в виду под "извращаться".
L>Иногда такую табличку можно и в процедуре генерировать.

Ага — просто это ща для меня актуально. Я раньше всё за сервер переживал, всё под 3-ю нормальную подводил, а теперь понял, что главное, что бы всё работало быстро! Т.е. я сейчас не стесняюсь избыточные данные хранить...
Чего и всем советую, если есть такая возможность!
Re[5]: Как сделать выборку по отсутствующим значениям
От: Lexey Россия  
Дата: 07.02.03 09:50
Оценка:
Здравствуйте, Lynxin, Вы писали:

L>>В общем-то, именно это я имел в виду под "извращаться".

L>>Иногда такую табличку можно и в процедуре генерировать.

L>Ага — просто это ща для меня актуально. Я раньше всё за сервер переживал, всё под 3-ю нормальную подводил, а теперь понял, что


Ага, 3-я нормальная зачастую несовместима со скоростью.

главное, что бы всё работало быстро! Т.е. я сейчас не стесняюсь избыточные данные хранить...
L>Чего и всем советую, если есть такая возможность!

А то я не знаю. Я тут полтора месяца занимался тюнингом производительности базы с миллионами записей.
Только вот в данном случае скорее всего выгоднее делать обработку на клиенте. Хотя, все конечно зависит от реальных данных и задачи.
Re: Как сделать выборку по отсутствующим значениям
От: Toughpheeckouse Россия  
Дата: 07.02.03 09:54
Оценка:
Здравствуйте, Аноним, Вы писали:

...
А>Как сделать выборку, результатом которой будет
А>набор записей пропущенных из последовательности.
А>Т.е
А>4
А>9

нельзя найти то чего нет

может так подойдет?


select t.f+1 from table3 t left outer join table3 t1 on t.f+1 = t1.f
where t1.f is null
Думайте сами, решайте сами...
Re: Как сделать выборку по отсутствующим значениям
От: Merle Австрия http://rsdn.ru
Дата: 07.02.03 09:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как сделать выборку, результатом которой будет

А>набор записей пропущенных из последовательности.
А>Т.е
А>4
А>9

Поскольку мы имеем дело с SQL'ем, который предназначен для операций над таблицами, то если значений нет, то и взяться им неткуда... Тоесть просто так эти пропущенные цифры не получить. И как справедливо замечено выше, не стоит нагружать сервер чужой работой, это клиентская задача...
С другой стороны зависит конечно от условий, как опять же верно замечено.
Отсюда возможны варианты:
Если может быть пропущена одна и только одна цифра, тогда можно поступить так, взять начало каждой непрерывной последовательности и вычесть единичку.
SELECT t1.value - 1 FROM <table> t1 WHERE
NOT EXISTS (SELECT 1 FROM <table> t2 WHERE t1.value - 1 = t3.value)
AND t1.value > 1  -- здесь мы исключаем нижнюю цифру которая за пределами диапазона


Если же разрыв может состоять из нескольких пропущенных значений, то либо генерить табличку с непрерывным диапазоном и с ней сравнивать, что вообщем-то скучно и неинтересно, либо можно получить начало и конец каждого непрерывного диапазона,
например так:
SELECT
  t1.value, min(t2.value)
  FROM <table> t1 JOIN <table> t2 ON t1.value <= t2.value
WHERE
  NOT EXISTS (SELECT 1 FROM <table> t3 WHERE t1.value - 1 = t3.value)
  AND
  NOT EXISTS (SELECT 1 FROM <table> t4 WHERE t2.value + 1 = t4.value)
GROUP BY t1.value

и уже по этим данным что-либо достроить.


P. S. Все это конечно здорово, но давайте все-таки будем указывать сервер, когда задаем вопрос... Ведь в правилах форума нигде не написано, что здесь общаются телепаты, или я что-то упустил? Хотя вряд ли, телепатам форум не нужен, они и так все знают...
Мы уже победили, просто это еще не так заметно...
Re: Как сделать выборку по отсутствующим значениям
От: Аноним  
Дата: 07.02.03 11:03
Оценка:
Спасибо всем за ответы.
В целом идеи понятны.

Прошу прощение за упущение в детализации поставленного вопроса.
База MS Access. Поля — Date/Time
Я с числами написал для простоты и с целью поиска общего решения.


Кстати в моем случае нагрузку желательно перенести не на клиента а на сервер.
Надеюсь что будет найдено наиболее качественное (оптимальное решение)
Re[2]: Как сделать выборку по отсутствующим значениям
От: Lexey Россия  
Дата: 07.02.03 11:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Прошу прощение за упущение в детализации поставленного вопроса.

А>База MS Access. Поля — Date/Time
А>Я с числами написал для простоты и с целью поиска общего решения.

Мда, тяжелый случай. В дате/времени могут быть дырки такой величины, что генерировать тут какие-либо таблицы можно просто упариться.

А>Кстати в моем случае нагрузку желательно перенести не на клиента а на сервер.


Access — это сервер?
Делать только в клиентском коде и никак иначе.
Re[3]: Как сделать выборку по отсутствующим значениям
От: Аноним  
Дата: 07.02.03 11:13
Оценка:
L>Access — это сервер?
База MS Access
См. Выше
Re[2]: Как сделать выборку по отсутствующим значениям
От: Merle Австрия http://rsdn.ru
Дата: 07.02.03 14:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я с числами написал для простоты и с целью поиска общего решения.

Нету тут общего решения...

А>Кстати в моем случае нагрузку желательно перенести не на клиента а на сервер.

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

А>Надеюсь что будет найдено наиболее качественное (оптимальное решение)

Качественное решение зависит от частностей, от диапазона дат, от дискретности (раз в месяц или раз в секунду), от того насколько набор дат постоянен или наоборот, всегда растет....

У Х. Д. и у кого-то еще из модераторов в подписи есть ссылка на то как правильно задавать вопрос.
Еще раз повторюсь, мысли здесь читать никто не умеет.
Мы уже победили, просто это еще не так заметно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.