Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Aggregate function
|
|||
|---|---|---|---|
|
#18+
Доброе время суток! Совсем замучился. Задача: Есть данные: id | value ----------- 1 | 3 1 | 5 1 | 2 2 | 1 2 | 5 2 | 4 3 | 5 3 | 5 3 | 5 3 | 2 Нужно узнать, сколько раз значение "value" превышает 50% своего максимума для каждого ID (и эти "50%" задавать как параметр). Хотелось бы что-то вроде запроса: select id, my_func_count(value, 0.5) as mcount from table group by id; id | mcount ----------- 1 | 2 2 | 2 3 | 3 Возможно ли написать такую функцию "my_func_count"? Более сложный вариант - нужно произвольным образом обработать набор значений внутри каждого ID и выдать какой-то результат, причем способ обработки предполагает доступ ко всем значениям одновременно. Т.е. f(3, 5, 2), f(1, 5, 4) и f(5, 5, 5, 2). Заранее спасибо! Я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 11:48 |
|
||
|
Aggregate function
|
|||
|---|---|---|---|
|
#18+
Пусть есть таблица TEST с такими данными: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Вот запрос, который решит поставленную тобой задачу: Код: 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. Вместо 0.5 нужно подставить переменную привязки, через которую передавать нужное значение для параметра... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 12:00 |
|
||
|
Aggregate function
|
|||
|---|---|---|---|
|
#18+
select a.* from t as a join ( select id, max(value) as max_value from t group by id ) as b on ( a.id = b.id and a.value > b.value / 2 ); Если агрегатной функцией, то можно попробовать в качестве состояния использовать постгресовый массив. Но имхо, это некрасивое решение, как и постгресовые массивы вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 12:07 |
|
||
|
Aggregate function
|
|||
|---|---|---|---|
|
#18+
задача конечно решается на одном проходе. но не в агрегате. (агрегат гонит исчисляемый результат-скаляр (в некоем смысле) вдоль по набору, а надо гнать массив с весами встречаемости). Правда и процедуру на plpgsql через массив я расписать не решился бы. Посмотрел бы в сторону создания темповой таблички - индексный столбец значений и столбец весов. (с тем, чтобы сортировки самому не реализовывать) кстати, "выигрыш" при одном прогоне будет (если и будет) разве что в случае обилия повторений. При редкоповторяемости значений - задача поиска в массиве значений (после определения максимума) практически вычислительно совпадет с задачей поиска в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 13:04 |
|
||
|
Aggregate function
|
|||
|---|---|---|---|
|
#18+
pltcl или plperl - для сложных вычислений самое оно, например, если потребуется не один параметр 0,5 использовать, а несколько и для каждого нечто подобное вычислять. Можно использовать массивы, если для них соответствующие агрегаты написать, но быстродействие аховое получается (хотя иногда удобно, если запрос редко выполняется и данных не слишком много). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2007, 22:30 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34489175&tid=2005505]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 346ms |

| 0 / 0 |
