|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Здравствуйте, господа. Помогите пожалуйста. Есть таблица интервалов (приложение), где BHID - номер выборки, FROM - значение начала интервала выборки, TO - значения конца интервала выборки, NS - номер интервала. Нужно запросом отобразить пропущенные интервалы, например: для BHID=1 пропущенный интервал 8-10, для BHID=2 пропущенный интервал 10-12. Пока получилось только рассчитать в какой выборке есть пропуск: 1. Запрос [2_12_011_Ancillary]: SELECT ASSAY.BHID, Sum([to]-[from]) AS SumLen, Max(ASSAY.TO) AS MaxTO, Min(ASSAY.FROM) AS [Min-FROM], Count(ASSAY.NS) AS [Count-NS] FROM ASSAY GROUP BY ASSAY.BHID HAVING (((ASSAY.BHID)<>"")); 2. Запрос [Пропуски и перехлёсты]: SELECT [2_12_011_Ancillary].BHID, [2_12_011_Ancillary].SumLen, [2_12_011_Ancillary].MaxTO, Abs([SumLen]-[MaxTO]) AS Div, IIf([SumLen]-[MaxTO]>0,"Перехлест","Пропуск") AS [Возможная ошибка] FROM 2_12_011_Ancillary WHERE (((Abs([SumLen]-[MaxTO]))>0.01)); ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2015, 18:39 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Есть еще вариант, но он не устраивает, т.к. отображает только соседние интервалы от пропущенного: 1. Запрос [2_12_011_Ancillary]: SELECT ASSAY.BHID, Sum([to]-[from]) AS SumLen, Max(ASSAY.TO) AS MaxTO, Min(ASSAY.FROM) AS [Min-FROM], Count(ASSAY.NS) AS [Count-NS] FROM ASSAY GROUP BY ASSAY.BHID HAVING (((ASSAY.BHID)<>"")); 2. Запрос [2_12_01_Пропуски]: SELECT [2_12_011_Ancillary].BHID, [2_12_011_Ancillary].SumLen, [2_12_011_Ancillary].MaxTO, Abs([SumLen]-[MaxTO]) AS Div, IIf([SumLen]-[MaxTO]>0,"Перехлест","Пропуск") AS [Возможная ошибка] FROM 2_12_011_Ancillary WHERE (((Abs([SumLen]-[MaxTO]))>0.01)); 3. Запрос [Пропуски]: SELECT [2_12_01_Пропуски].BHID AS Выражение1, [2_12_01_Пропуски].F1 AS [FROM], [2_12_01_Пропуски].T1 AS [TO] FROM 2_12_01_Пропуски WHERE ((([2_12_01_Пропуски].X)<>2)); ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2015, 18:55 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Пронумеруйте интервалы в группе с равными [BHID] (скажем, по возрастанию FROM), а затем выберите пары, у которых номер различается на 1, а [TO] меньшего не равно [FROM] большего. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2015, 19:25 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Diminicandum, потестируйте такой вариант Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2015, 20:28 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Akina, спасибо за ответ. К сожалению с Access только начал знакомство, не знаю как пронумировать интервалы, единственное что приходит в голову: "ID1:[BHID]&"-"&[NS]". Подскажите пожалуйста, как задать последовательную нумерацию отсортированных проб? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 10:37 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
-Практикант-, спасибо огромное! Работает! Правда совсем не похоже на знакомые мне "запросы" Access. Посоветуйте пожалуйста книги по SQL, желательно для "чайников"? С чего начать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 10:40 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
DiminicandumС чего начать? Порекомендую бесплатные онлайн-курсы на intuit.ru по основам SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 10:43 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Diminicandum, а почему это надо делать именно запросом? Я бы в процедуре открыл Recordset, отсортированный по BHID и FROM, в цикле для каждого BHID сравнивал FROM текущей с TO предыдущей и вылавливал пропущенные. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 10:44 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Diminicandumне знаю как пронумировать интервалы Посмотрите тему Автонумерация записей внутри группы (ногами не бить) :) . Рекомендую использовать метод 2 (с использованием DCount), он наиболее прост для понимания и адаптации. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 10:48 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Анатолий ( Киев )Diminicandum, а почему это надо делать именно запросом? Я бы в процедуре открыл Recordset, отсортированный по BHID и FROM, в цикле для каждого BHID сравнивал FROM текущей с TO предыдущей и вылавливал пропущенные. Я понял, тут извращенсы-им нравится все на SQL, а то что он для многих вещей не предназначен, это их не интересует вся фишка, что на SQL портянке величиной А4. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 12:06 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROIАнатолий ( Киев )Diminicandum, а почему это надо делать именно запросом? Я бы в процедуре открыл Recordset, отсортированный по BHID и FROM, в цикле для каждого BHID сравнивал FROM текущей с TO предыдущей и вылавливал пропущенные. Я понял, тут извращенсы-им нравится все на SQL, а то что он для многих вещей не предназначен, это их не интересует вся фишка, что на SQL портянке величиной А4. А я уверен, что делатьтакие вещи в рекордсете - как раз и есть извращение! SQL как раз и предназначен для таких вещей и вменьшей мере в курсорах и рекордсетах! В аксе, конечно, труднее такие вещи делаются, но, пожалуйста, -Практикант- , хоть и не оптимальным способом, но показал как это сделать. Akina на пальцах рассказал как это сделать. Ничего сложного. Только понять. А как будем писать в рекордсете? И куда и как выводить результат? При достаточно большом объеме данных, уверен, селект отработает значительно быстрее. ЗЫ Я уж не говорю о SQL Server, где сейчас счетчик длается мгновенно ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 12:32 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Rivkin Dmitryуж не говорю о SQL Server, где сейчас счетчик длается мгновенно Вы заблуждаетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 12:45 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROI , открывать рекордсет и волочь все данные на клиента для обработки, которую можно выполнить на сервере, чтобы потом принять только готовый результат - вот это и есть извращение. Правда, таких извращенцев очень трудно лечить - нужны сильные средства, типа канала до сервера через EDGE или там платно-помегабайтного трафика. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 13:20 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROIRivkin Dmitryуж не говорю о SQL Server, где сейчас счетчик длается мгновенно Вы заблуждаетесь. Ну, что-же, предлагаю предъявить код. Вот так я вижу решение в аксе: 1 этап - создаем сохраняемый запрос tmp: Код: sql 1. 2.
2 этап - сабственно запрос с участием двух сохраненных: Код: sql 1. 2. 3. 4. 5. 6.
Все В терминах SQL Server: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Предлагаю вам привести код обработки в рекордсете, а автора топика произвести испытания и рассудить нас Желательно, конечно, на таблице, содержащей побольше записей ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 13:59 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Akina ROI , открывать рекордсет и волочь все данные на клиента для обработки, которую можно выполнить на сервере, чтобы потом принять только готовый результат - вот это и есть извращение. Правда, таких извращенцев очень трудно лечить - нужны сильные средства, типа канала до сервера через EDGE или там платно-помегабайтного трафика. +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:00 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Akina ROI , открывать рекордсет и волочь все данные на клиента для обработки, которую можно выполнить на сервере, чтобы потом принять только готовый результат - вот это и есть извращение. Правда, таких извращенцев очень трудно лечить - нужны сильные средства, типа канала до сервера через EDGE или там платно-помегабайтного трафика. Я говорил про портянки А4 на SQL. Еще вопрос в чем (открывать рекордсет и волочь все данные на клиента) или портянка величиной А4 на SQL. Если учесть что форум по "Access" ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:00 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROIЯ говорил про портянки А4 на SQL. А какая разница, сколько строк в коде, если он правилен и эффективен? Кстати, SQL-запрос вполне можно записать в ОДНУ строку, а при печати уменьшить шрифт и уложиться в ма-а-аленький квадратик. ROIЕсли учесть что форум по "Access" Как раз сентенции про SQL-портянки делают обсуждение идеологическим и выводят за рамки отдельно взятой СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:08 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
AkinaА какая разница, сколько строк в коде, если он правилен и эффективен? Кстати, SQL-запрос вполне можно записать в ОДНУ строку, а при печати уменьшить шрифт и уложиться в ма-а-аленький квадратик. Разнинца огромная 90% пишущего на наш форум вообще не имеют понятия о RecordSet, а у ж тем более о синтаксисе SQL. AkinaROI Как раз сентенции про SQL-портянки делают обсуждение идеологическим и выводят за рамки отдельно взятой СУБД. Естественно, они основ не знают а вым им SQL в зубы ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:19 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROI90% пишущего на наш форум вообще не имеют понятия о RecordSet А оно им зачем? ну так... мастера есть, визуальная рихтовка форм/отчётов есть, и этими инструментами накрывается 90% надобностей пишущего тут народа. Более того, визуальное построение запроса зачастую и проще, и быстрее, чем пальцы ломать - а заодно, что приятно, построитель не ошибается в синтаксисе. Можно вообще и слова такого не знать - SQL,- и тем не менее создать достаточно объёмное и функциональное приложение - и я видел такие. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:47 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Akinaмастера есть, визуальная рихтовка форм/отчётов есть, и этими инструментами накрывается 90% надобностей пишущего тут народа. Более того, визуальное построение запроса зачастую и проще, и быстрее, чем пальцы ломать - а Это когда такое помогало в том то и дело, что они мастерами не могут, а уж в ручную как вы говорите "рихтовать". Вы очень наивны. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 14:57 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Diminicandum, я бы видимо для ясности в понимании решала задачу процедурой видимо сюда бы добавила проверку на наложение интервалов Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 15:01 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
ROI...90% пишущего на наш форум вообще не имеют понятия о RecordSet, а у ж тем более о синтаксисе SQL.Это откуда такие данные про 90%? С потолка? Хоть один аргумент убедительный приведите. ROIЕстественно, они основ не знают а вым им SQL в зубыА что, SQL такой прям бином Ньютона?))) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2015, 15:05 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
Решил не ждать милостей от природы :) и сравнить свой запрос 18304646 с запросом Akina-Rivkin 18307428 . Заодно до кучи и процедуру, определяющую пропущенные интервалы и помещающую результаты в таблицу tabSkip, прилепил (см. текст ниже,в спойлере). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Результаты тестирования приведены ниже и получены при 100 000 записей исходной таблицы ASSAY, которая кроме того имела составной индекс по полям BHID и FROM. Время работы участников теста приведено в секундах. ПробаПроцедура-Практикант-Akina-Rivkin10.656253.85937522.2656320.68753.85937521.7343830.656253.89062522.54688 Следует отметить, что отсутствие индекса слабо влияло на работу процедуры и запроса -Практикант-, а вот запрос Akina-Rivkin становился ну очень тормознутым. Даже на объеме 10 000 записей время его работы превысило 50 минут (больше не хватило терпения ждать и вырубил его). Немного улучшился показатель (~21 мин.) при замене в запросе tmp подзапроса с Count на функцию DCount. На всякий случай Процедура заполнения исходной таблицы ASSAY Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Процедура тестирования Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 21:49 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
-Практикант-... а вот запрос Akina-Rivkin становился ну очень тормознутым. Даже на объеме 10 000 записей время его работы превысило 50 минут... Отчаянные люди... А как же я ворочаю базы по 3+ мио записей с производительностью на E6750 4G, к примеру, от 10 до 30 тыс. записей в секунду? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2015, 22:28 |
|
Поиск пропущенных интервалов (2 поля)
|
|||
---|---|---|---|
#18+
-Практикант-, Вынужден признать, что в аксе рекордсет оказался шустрее запроса. Хотя я и остаюсь убежденным сторонником работы с запросами, чем с рекордсетами. Пока объяснения результатам проверки я не нашел. Даже при уточнении проверки - после отработки процедуры следует открыть результат запроса в рекордсете, так-же, как и результат твоего запроса. Свою процедуру я изменил незначителтно: вместо запроса tmp я создаю и заполняю таблицу с таким же именем. Количество записей в исходной таблице я увеличил на порядок. В результате получил timtest Proc 18.78125 Pract 68.89453 Akina-Rivkin 53.09375 Т.е. запросы оказались медленее процедуры в 3-4 раза. Странно. Предполагаю, что сей эффект верен только для локальной БД, когда не надо тащить данные по сети. Попробую сделать проверку в сети. Доложусь ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2015, 10:57 |
|
|
start [/forum/topic.php?fid=45&msg=39082482&tid=1614179]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 484ms |
0 / 0 |