Если есть последовательность данных
типа 1
2
3
5
6
7
8
10
Как сделать выборку, результатом которой будет
набор записей пропущенных из последовательности.
Т.е
4
9
Re: Как сделать выборку по отсутствующим значениям
Здравствуйте, Аноним, Вы писали:
А>Если есть последовательность данных А>типа А>1 А>2 А>3 А>5 А>6 А>7 А>8 А>10 А>Как сделать выборку, результатом которой будет А>набор записей пропущенных из последовательности. А>Т.е А>4 А>9
AFAIK, нет таких средств. Нужно как-то извращаться. Что у тебя за база?
А вообще, наверное правильнее такое делать не клиенте — получать отсортированный список всех записей, смотреть min/max и самому находить дырки — незачем сервер идиотской работой понапрасну нагружать.
Re[2]: Как сделать выборку по отсутствующим значениям
Зависит от последвательности, да и много от чего... Если не жалко места, то создай табличку с правильной последовательностью и выбирай себе "Where myField Not In....". Не экономно, но продуктивно! L>AFAIK, нет таких средств. Нужно как-то извращаться. Что у тебя за база? L>А вообще, наверное правильнее такое делать не клиенте — получать отсортированный список всех записей, смотреть min/max и самому находить дырки — незачем сервер идиотской работой понапрасну нагружать.
Re[3]: Как сделать выборку по отсутствующим значениям
Здравствуйте, Lynxin, Вы писали:
L>Здравствуйте, Lexey, Вы писали:
L>Зависит от последвательности, да и много от чего... Если не жалко места, то создай табличку с правильной последовательностью и выбирай себе "Where myField Not In....". Не экономно, но продуктивно!
В общем-то, именно это я имел в виду под "извращаться".
Иногда такую табличку можно и в процедуре генерировать.
Re: Как сделать выборку по отсутствующим значениям
Здравствуйте, <Аноним>, Вы писали:
А>Если есть последовательность данных А>типа А>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]: Как сделать выборку по отсутствующим значениям
L>>Здравствуйте, Lexey, Вы писали: L>В общем-то, именно это я имел в виду под "извращаться". L>Иногда такую табличку можно и в процедуре генерировать.
Ага — просто это ща для меня актуально. Я раньше всё за сервер переживал, всё под 3-ю нормальную подводил, а теперь понял, что главное, что бы всё работало быстро! Т.е. я сейчас не стесняюсь избыточные данные хранить...
Чего и всем советую, если есть такая возможность!
Re[5]: Как сделать выборку по отсутствующим значениям
Здравствуйте, Lynxin, Вы писали:
L>>В общем-то, именно это я имел в виду под "извращаться". L>>Иногда такую табличку можно и в процедуре генерировать.
L>Ага — просто это ща для меня актуально. Я раньше всё за сервер переживал, всё под 3-ю нормальную подводил, а теперь понял, что
Ага, 3-я нормальная зачастую несовместима со скоростью.
главное, что бы всё работало быстро! Т.е. я сейчас не стесняюсь избыточные данные хранить... L>Чего и всем советую, если есть такая возможность!
А то я не знаю. Я тут полтора месяца занимался тюнингом производительности базы с миллионами записей.
Только вот в данном случае скорее всего выгоднее делать обработку на клиенте. Хотя, все конечно зависит от реальных данных и задачи.
Re: Как сделать выборку по отсутствующим значениям
Здравствуйте, Аноним, Вы писали:
А>Как сделать выборку, результатом которой будет А>набор записей пропущенных из последовательности. А>Т.е А>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]: Как сделать выборку по отсутствующим значениям
Здравствуйте, Аноним, Вы писали:
А>Прошу прощение за упущение в детализации поставленного вопроса. А>База MS Access. Поля — Date/Time А>Я с числами написал для простоты и с целью поиска общего решения.
Мда, тяжелый случай. В дате/времени могут быть дырки такой величины, что генерировать тут какие-либо таблицы можно просто упариться.
А>Кстати в моем случае нагрузку желательно перенести не на клиента а на сервер.
Access — это сервер?
Делать только в клиентском коде и никак иначе.
Re[3]: Как сделать выборку по отсутствующим значениям
От:
Аноним
Дата:
07.02.03 11:13
Оценка:
L>Access — это сервер?
База MS Access
См. Выше
Re[2]: Как сделать выборку по отсутствующим значениям
Здравствуйте, Аноним, Вы писали:
А>Я с числами написал для простоты и с целью поиска общего решения.
Нету тут общего решения...
А>Кстати в моем случае нагрузку желательно перенести не на клиента а на сервер.
Здесь ты не нагрузку, а головную боль переносишь... В принципе можно конечно и на потолке спать, но неудобно, одеяло спадает.
А>Надеюсь что будет найдено наиболее качественное (оптимальное решение)
Качественное решение зависит от частностей, от диапазона дат, от дискретности (раз в месяц или раз в секунду), от того насколько набор дат постоянен или наоборот, всегда растет....
У Х. Д. и у кого-то еще из модераторов в подписи есть ссылка на то как правильно задавать вопрос.
Еще раз повторюсь, мысли здесь читать никто не умеет.