|
|
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Задача: Расчитать 95 пронцентиль Теория: Процентили - те значения в ряду наблюдений, расположенных в порядке возрастания величин, которые делят распределение на 100 равных частей (таким образом, медиана будет пятидесятым процентилем). Пример расчета: Вариационный ряд (13 проб в порядке возрастания концентраций по хрому). Хром является веществом III класса опасности. ПДК 0,5. 0; 0; 0,1; 0,3; 0,35; 0,42; 0,48; 0,56; 1,02; 1,25; 1,48; 1,75; 1,78. 95% уровень= 13 (число вариант) x 95 -------------------------------------------------------------------------------- 100 =12,35 Полученное число необходимо округлить в большую сторону до целого числа (получаем 12). Таким образом, двенадцатая варианта, соответствующая 1,75, является 95% уровнем. Данные: Среда разработки: MS Access 2000/2002 таблицы: Город->ТочкаНаблюдения->Выборка<-Вещество (приближенно) Вожможные пути решения: Написать пользовательскую функцию на подобие MIN("..."), осуществляющей возврат минимальной величены концентрации в-ва из 5% списка, взятого из полного списка (удовлетворяющим необходимым условиям), отсортированного по убыванию. Т.е: 1) сформировать список, удовлетворяющий необходимым условиям и отсортированного по убыванию. 2) Взать 5 % от списка и выбрать MIN элемент. Проблема: примерная конструкция: SELECT TOP 1 ДанныеИзмерений.Концентрация AS 95prontentil, FROM ДанныеИзмерений WHERE ("условие001") AND ((ДанныеИзмерений.КодДанных) In ( SELECT TOP 5 PERCENT ДанныеИзмерений.КодДанных FROM ТочкаНаблюдения INNER JOIN (Вещество INNER JOIN ДанныеИзмерений ON Вещество.КодВв = ДанныеИзмерений.КодДаннВв) ON ТочкаНаблюдения.код = Вещество.КодТочки WHERE ("условие001") ORDER BY ДанныеИзмерений.Концентрация DESC)) ) ORDER BY ДанныеИзмерений.Концентрация; Возвращает несколько повторяющихся строк. При использование DISTINCT во внешнем запросе обработка "уходит" в бескончный цикл. В вложеном error. Функции MIN(...)/MAX(...) в конфликте с сортировкой ORDER BY. И по своей сути вообще не верна, т.к. не может динамически учесть все особености условий выборки. Не писать же для каждого в-ва отдельный запрос! Help: Подскажите конструкцию на SQL или как написать пользовательскую функцию на подобие MIN("..."). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 12:23 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
крутая идейка примерные решения сходу: а) 1 запрос - все значения 2 запрос - сумма по значениям первого 3 запрос - объединить 1 и 2 = получишь рядом с каждым значением 1-го одно и то же суммарное значение второго. добавишь вычисляемое поле - получил % каждого значения в итоге возможно это не совсемто, но как идея б) писать ПРОЦЕДУРУ (sub), а не функцию юзверя. процедура должна открыть рекодсет (см хэлп на ADO\DAO), прочесать его весь (for ... next) и рассчитать все что нужно. будешь напирать на function - будут пролемы с обнулением статической переменной и считаванием рез-та, уж не считая понимания ее работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 14:35 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Я бы сделал так. 1.Пронумеровал бы записи в таблице. например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Как это сделать посмотри здесь или поищи по форуму. 2 Потом пишешь Код: plaintext 1. 2. P.S (select count(*) from mytable where matter='хром' ) *0.95 округляешь так как тебе надо.Я не совсем понял как надо округлять ,так как 12,35-->12 это не округлить в большую сторону до целого числа ,но в общем это не принципиально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 22:25 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Наконец-то два стоящих ответа с не битыми ссылками. Будем искать дальше. Шоу продолжается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:06 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
О!!! Да тут у нас шоу! Как же я такое мог пропустить! Ты эта.. в следующий раз сразу говори - "Спросил елеминтарную никому не нужную фигню чтоб увидеть небитую ссылку". Тогда я сразу и приду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:10 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Sorry. На радостях не то сказал. Все очень серьезно завтра уже сдача проекта а у меня с гулькин нос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:27 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
(позвольте, коллеги...) Создайте параметризованный запрос, выводящий нужный список, типа вашего примера: 0; 0; 0,1; 0,3; 0,35; 0,42; 0,48; 0,56; 1,02; 1,25; 1,48; 1,75; 1,78. Назовем этот запрос q. Тогда этот селект отбирает то, что надо (вроде бы... сильно не проверял - я счас под грибами лежу): SELECT min(proba) FROM q WHERE (select count(*) from q as b where b.proba>=q.proba)- (select count(*) from q as c where c.proba=q.proba)+1 <=int((select count(*) from q)*0.95+0.5); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:30 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
И самый главный вопрос - а на хера это делать обязательно запросом, и обязательно одним? Ради спортивного интереса? Такое объяснение вполне катит. А еще для чего? По моему гораздо проще открыть рекордсет и отшагать 5% записей с конца. Где остановишься - там и будет твое гнездо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:46 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
ПЛ: Вся проблемма в том, что с DAO я не сталкивался раньше. И RecordSet для меня пока сумерки. Напиши шаблон а дальше aaim sam. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2003, 23:54 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Имена таблиц и полей подставиь сам. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Сомневаюсь, что оно в итоге будет работать медленнее чем запрос ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 00:14 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Имелось в виду Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 00:16 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Сорри, не с того конца отсчет делал. Надо начинать от минимальной пробы: SELECT max(proba) FROM q WHERE (select count(*) from q as b where b.proba<=q.proba)- (select count(*) from q as c where c.proba=q.proba)+1 <=int((select count(*) from q)*0.95+0.5); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 10:18 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Работать то оно будет, кто бы спорил. Фактически это модифицированный вариант VIG'а, в нем только учитываются повторяющиеся значения. И все-таки - есть у этого решения хоть какая-нибудь практическая ценность (кроме тренировки sql-навыков)? Алгоритм квадратичный, на больших объемах данных будет тормозить немерянно. Сейчас только что проверил. Обработал таким образом таблицу из 10000 записей. Без индекса я вообще не дождался пока оно отработает, с индексом - около 45 секунд. Не сравнить с расходами на "500 раз сделать MoveNext". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 11:17 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Ха, Лохп... абсолютно! Кто же спорит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 11:40 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Эх блин... Программирование ради программирования... Чистое искусство... Безо всякого практического применения... Аж на слезу пробило ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 11:45 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
Большое Вам Всем СПАСИБо коллеги. Здорово меня поддержали в трудную минуту. Благодаря Вам мой проект прошел на Ура. ЛП: Правильно говоришь что на больших объемах данных будет тормозить немерянно . Так и есть на алгоритме на SQL от RT+. RT+: Чем сложнее запрос, тем дольше он обрабатывается. Особенно если приходится многократно повторять одни и те же дейтсвия. Хотя я нашел совсем другой путь решения. Он дает хорошие результаты по скорости, но требует немного памяти :). 5000 записей обрабатывает менее чем за 10сек. Конструкция - 2-3 запроса обрабатывают первоначальные данные(расчет примитивных харастеристик - MAX, Ср.Ареф.Откл.,Ср.Знач.,% соотношение ну и другое). При форматировании отчета используется сортировка концентраций разных в-в. И банальное использовании ReDim с последующим выбором необходимого значения arrays(Int(95 * Count / 100)). И результат через 13сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 18:34 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
>Чем сложнее запрос, тем дольше он обрабатывается. Особенно если >приходится многократно повторять одни и те же дейтсвия. Спасибо!! Теперь буду знать!! :) PS Рад, что ты справился со своей траблой-даблой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2003, 20:16 |
|
||
|
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
|
|||
|---|---|---|---|
|
#18+
А вот ещё, из чистого любви к искусству Код: plaintext 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2003, 08:18 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32265672&tid=1679414]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 193ms |
| total: | 380ms |

| 0 / 0 |
