powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Расчет 95 пронцентиля (Ищу алгоритм на SQL)
18 сообщений из 18, страница 1 из 1
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32264949
Alexandrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача:
Расчитать 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("...").
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265139
Alexus12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
крутая идейка
примерные решения сходу:
а) 1 запрос - все значения
2 запрос - сумма по значениям первого
3 запрос - объединить 1 и 2 = получишь рядом с каждым значением 1-го одно и то же суммарное значение второго. добавишь вычисляемое поле - получил % каждого значения в итоге
возможно это не совсемто, но как идея

б) писать ПРОЦЕДУРУ (sub), а не функцию юзверя.
процедура должна открыть рекодсет (см хэлп на ADO\DAO),
прочесать его весь (for ... next) и рассчитать все что нужно.
будешь напирать на function - будут пролемы с обнулением статической переменной и считаванием рез-та, уж не считая понимания ее работы.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265672
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал так.
1.Пронумеровал бы записи в таблице. например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  Matter  Result   num
  хром      0           1 
  хром      0           2 
  хром      0 , 1        3 
  хром      0 , 3        4 
  хром      0 , 3        5 
  хром      0 , 42       6 
  хром      0 , 4        7 
  хром      0 , 56       8 
  хром      1 , 02       9 
  хром      1 , 25      10 
  хром      1 , 48      11 
  хром      1 , 75      12 
  хром      1 , 78      13 

Как это сделать посмотри здесь или поищи по форуму.
2 Потом пишешь
Код: plaintext
1.
2.
select * from mytable
where num=(select count(*) from mytable where matter='хром' ) * 0 . 95 

P.S (select count(*) from mytable where matter='хром' ) *0.95 округляешь так как тебе надо.Я не совсем понял как надо округлять ,так как 12,35-->12
это не округлить в большую сторону до целого числа ,но в общем это не принципиально.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265678
Alexandrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то два стоящих ответа с не битыми ссылками. Будем искать дальше. Шоу продолжается.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265683
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О!!!
Да тут у нас шоу!
Как же я такое мог пропустить!
Ты эта.. в следующий раз сразу говори - "Спросил елеминтарную никому не нужную фигню чтоб увидеть небитую ссылку". Тогда я сразу и приду.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265689
Alexandrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry. На радостях не то сказал. Все очень серьезно завтра уже сдача проекта а у меня с гулькин нос.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265691
RT+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RT+
Гость
(позвольте, коллеги...)

Создайте параметризованный запрос, выводящий нужный список,
типа вашего примера:
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);
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265695
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И самый главный вопрос - а на хера это делать обязательно запросом, и обязательно одним? Ради спортивного интереса? Такое объяснение вполне катит. А еще для чего?
По моему гораздо проще открыть рекордсет и отшагать 5% записей с конца. Где остановишься - там и будет твое гнездо.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265696
Alexandrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЛ: Вся проблемма в том, что с DAO я не сталкивался раньше. И RecordSet для меня пока сумерки. Напиши шаблон а дальше aaim sam.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265700
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имена таблиц и полей подставиь сам.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim lngRecCount as Long
lngRecCount = CurrentDb( "Select Count (*) Form Table1" )( 0 )

Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset( "Select * From Table1 Order By Field1 Desc" )

Dim i as Long
For i =  0  To lngRecCount* 0 . 05 
    rst.MoveNext
Next i

Debug.Print rst![НужноеТебеПоле]


Сомневаюсь, что оно в итоге будет работать медленнее чем запрос
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265703
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имелось в виду
Код: plaintext
lngRecCount = CurrentDb.OpenRecordset( "Select Count (*) Form Table1" )( 0 )
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32265974
RT+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RT+
Гость
Сорри, не с того конца отсчет делал. Надо начинать от минимальной пробы:

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);
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32266100
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работать то оно будет, кто бы спорил. Фактически это модифицированный вариант VIG'а, в нем только учитываются повторяющиеся значения.
И все-таки - есть у этого решения хоть какая-нибудь практическая ценность (кроме тренировки sql-навыков)?
Алгоритм квадратичный, на больших объемах данных будет тормозить немерянно.
Сейчас только что проверил. Обработал таким образом таблицу из 10000 записей. Без индекса я вообще не дождался пока оно отработает, с индексом - около 45 секунд. Не сравнить с расходами на "500 раз сделать MoveNext".
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32266149
RT+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RT+
Гость
Ха, Лохп... абсолютно! Кто же спорит?
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32266156
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх блин... Программирование ради программирования... Чистое искусство... Безо всякого практического применения...
Аж на слезу пробило
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32266997
Alexandrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое Вам Всем СПАСИБо коллеги. Здорово меня поддержали в трудную минуту. Благодаря Вам мой проект прошел на Ура.

ЛП: Правильно говоришь что на больших объемах данных будет тормозить немерянно . Так и есть на алгоритме на SQL от RT+.
RT+: Чем сложнее запрос, тем дольше он обрабатывается. Особенно если приходится многократно повторять одни и те же дейтсвия.

Хотя я нашел совсем другой путь решения. Он дает хорошие результаты по скорости, но требует немного памяти :). 5000 записей обрабатывает менее чем за 10сек.

Конструкция - 2-3 запроса обрабатывают первоначальные данные(расчет примитивных харастеристик - MAX, Ср.Ареф.Откл.,Ср.Знач.,% соотношение ну и другое). При форматировании отчета используется сортировка концентраций разных в-в. И банальное использовании ReDim с последующим выбором необходимого значения arrays(Int(95 * Count / 100)). И результат через 13сек.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32267061
RT+
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
RT+
Гость
>Чем сложнее запрос, тем дольше он обрабатывается. Особенно если
>приходится многократно повторять одни и те же дейтсвия.

Спасибо!! Теперь буду знать!! :)

PS Рад, что ты справился со своей траблой-даблой.
...
Рейтинг: 0 / 0
Расчет 95 пронцентиля (Ищу алгоритм на SQL)
    #32267183
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот ещё, из чистого любви к искусству
Код: 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.
create table q (material varchar( 2 ) not null, 
	proba float not null, 
	[id] int not null identity( 1 , 1 ) primary key
)
go
insert into q (material, proba)
values ( 'HR',  0  )
insert into q (material, proba)
values ( 'HR',  0  )
insert into q (material, proba)
values ( 'HR',  0 . 1  )
insert into q (material, proba)
values ( 'HR',  0 . 3  )
insert into q (material, proba)
values ( 'HR',  0 . 35  )
insert into q (material, proba)
values ( 'HR',  0 . 42  )
insert into q (material, proba)
values ( 'HR',  0 . 48  )
insert into q (material, proba)
values ( 'HR',  0 . 56  )
insert into q (material, proba)
values ( 'HR',  1 . 02  )
insert into q (material, proba)
values ( 'HR',  1 . 25  )
insert into q (material, proba)
values ( 'HR',  1 . 48  )
insert into q (material, proba)
values ( 'HR',  1 . 75  )
insert into q (material, proba)
values ( 'HR',  1 . 78  )
go
 -- MS SQL specific
 
select top  1  *
from (select top  5  percent *
        from q
        where material = @material
        order by proba desc) a
order by proba
 -- проблемы, которые тут возникнут: 
 
 -- 1. на малых объёмах данных будет ошибаться (на тестовом наборе выдаёт 
 
 --     запись с пробоё 1.78)
 
 -- 2. если хочется на 95 процентиаль, а другой, придётся использовать 
 
 --     динамический запрос
 
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Расчет 95 пронцентиля (Ищу алгоритм на SQL)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]