Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Перехожу с Oracle на PostgreSql . Просто любопытно - есть ли в pg что-либо похожее на аналитические функции Oraclе? Никакой информации в описании нет :-( но может кто знает или пытался как-то реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 14:13 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
есть такие функции: Aggregate Functions for Statistics ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 15:08 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Нету таких функций.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 15:22 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Аналитических, это вида - dense_rank() over (partition by ... ) Это чтоб в запросе без group by посчитать можно было сумму по группе накопительно , и отсортировать по этой накопительной , что-то в этом роде :-) В pg в какую сторону надо копать? Ужасно ведь неохота одно и тоже несколько раз собирать :-( Может есть все-таки что-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 15:49 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
какая аналитика, даже ROWNUM аналога пока нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 16:18 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Или там посчитать сумму по каждой группе , и бросить ее (сумму) в каждую строку группы чтоб посчитать %ое соотношение . Ну вообщем, много еще чего придумать можно :-) Но похоже ,действительно, одним запросом в PG не получится. Если только функцией - а в ней сначала группировку по таблице , а потом по каждой группе выбирать опять ! =8-( ,) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 16:26 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231Или там посчитать сумму по каждой группе , и бросить ее (сумму) в каждую строку группы чтоб посчитать %ое соотношение .self-join ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 16:34 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat bege231Или там посчитать сумму по каждой группе , и бросить ее (сумму) в каждую строку группы чтоб посчитать %ое соотношение .self-join Ну тоже не совсем чтоб подходит . Да и таблички у меня не то что в example - Weather&Weather :-) Все равно спасибо ! За волю к победе! :-) Хотя, объединить первоначальную таблицу и ее же группировку - это мысль. Поторопилась я, конечно, насчет функции в предыдущем своем посте . Ну, буду привыкать быть проще! ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2008, 16:56 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatself-joinв коррелированном скалярном подзапросе во фразе select. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 05:31 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
select a.*, b.total from t1 as a natural join ( select group_id, sum(value) as total from t1 group by group_id ) as b; я имел в виду такое. это называется "коррелированным скалярным подзапросом во фразе select"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 11:19 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatselect a.*, b.total from t1 as a natural join ( select group_id, sum(value) as total from t1 group by group_id ) as b; я имел в виду такое. это называется "коррелированным скалярным подзапросом во фразе select"? А если , например, надо посчитать невязку с общей суммой по группе и бросить ее на максимальный элемент в группе? Тут уж точно одним запросом не обойдешься в pg :( Как считаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 11:42 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231А если , например, надо посчитать невязку с общей суммой по группе и бросить ее на максимальный элемент в группе? Тут уж точно одним запросом не обойдешься в pg :( Как считаете?Смотря что понимать под "одним запросом". А вообще можно. Но нужно ли? Монстр ещё тот получится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 12:32 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatselect a.*, b.total from t1 as a natural join ( select group_id, sum(value) as total from t1 group by group_id ) as b; я имел в виду такое. это называется "коррелированным скалярным подзапросом во фразе select"?Не-а, я имел ввиду немного другое: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 12:33 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231А если , например, надо посчитать невязку с общей суммой по группе и бросить ее на максимальный элемент в группе?что-то подзабыл математику, нагуглить быстро не получилось. по какой формуле и какому алгоритму это надо считать? какой должен быть результат для таких исходных данных: group_id, value 1, 3 1, 4 1, 4 2, 5 2, 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 12:51 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatчто-то подзабыл математику, нагуглить быстро не получилось. по какой формуле и какому алгоритму это надо считать? какой должен быть результат для таких исходных данных: group_id, value 1, 3 1, 4 1, 4 2, 5 2, 6 Пример : Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 13:19 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Бабичев СергейНе-а, я имел ввиду немного другое: Код: plaintext 1. 2. А тоже работает! Хотя и медленее чем join . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 13:27 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231 Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 13:41 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat bege231 Код: plaintext 1. 2. 3. 4. 1- value надо рассчитать в процентном соотношении - 3.47 * ( 351/(351+376+100)) 2 - т.о. по группе получается общая сумма 3,37 (должно быть 3,47) , невязка - 0.10 3 - невязку прибавляем к максимальной ( max =376 , прибавляем .10 к 1.56 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 13:53 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231 Код: plaintext 1. 2. 3. 4. 1- value надо рассчитать в процентном соотношении - 3.47 * ( 351/(351+376+100))еще сильнее запутался. :-) какие колонки составляют входные данные? 3.47 * ( 351/(351+376+100)) ~= 1.47. не вижу 1.47 в приведенной вами таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:20 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Первоначальные колонки - сумма , группа , оплата 3.47 * ( 351/(351+376+100)) ~= 1.47. не вижу 1.47 в приведенной вами таблице. 1.39 и есть 1.47 :) Ошиблась чуть-чуть . Но вообще-то , 1.46 даже скорее . Все равно невязка будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:35 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege2313.47 * ( 351/(351+376+100)) ~= 1.47. не вижу 1.47 в приведенной вами таблице.1.39 и есть 1.47 :) Ошиблась чуть-чуть .кто ошиблась? :) постгрес? 1.39 - входные данные? но вы не перечислили value в списке входных данных "сумма , группа , оплата". не понимаю. :-( откуда взялось 1.39? bege231Но вообще-то , 1.46 даже скорее .мой калькулятор считает 3.47 * ( 351/(351+376+100)) = 1.4727569528416. это скорее 1.47, чем 1.46. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:47 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat bege231 3.47 * ( 351/(351+376+100)) ~= 1.47. не вижу 1.47 в приведенной вами таблице.1.39 и есть 1.47 :) Ошиблась чуть-чуть .кто ошиблась? :) постгрес? 1.39 - входные данные? но вы не перечислили value в списке входных данных "сумма , группа , оплата". не понимаю. :-( откуда взялось 1.39? bege231Но вообще-то , 1.46 даже скорее .мой калькулятор считает 3.47 * ( 351/(351+376+100)) = 1.4727569528416. это скорее 1.47, чем 1.46. Я ошиблась . Пример был рассчитан мной ! и 1.39 собственноручно посчитала. И value не входит в исходные данные , а тоже рассчитывается . А если 351/(351+376+100) округлить до 2х знаков ? Ну пусть уже будет 1.47 . Это что-то меняет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 14:57 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231Это что-то меняет?не меняет. я не разбираюсь в данной предметной области, из ваших объяснений понять задачу не могу. умываю руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 15:02 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat 12:51по какой формуле и какому алгоритму это надо считать? bege231 14:57А если 351/(351+376+100) округлить до 2х знаков ?лишь через два часа после моего вопроса вы проронили слово "округлить". для вас это наверняка очевидно, но например я и понятия не имел, что в этой задаче используется округление. знаете, что правильно сформулированная задача - уже половина решения? почему вы не смогли четко сформулировать задачу? - дана таблица из трех полей (сумма, группа, оплата) - для каждой строки приближенно вычислить с округлением до заданной точности 10**N поле value по формуле trunc( сумма*оплата/(sum_по_группе(оплата)), N ) - для каждой группы вычислить невязку по формуле сумма-sum_по_группе(value) - для каждой группы добавить невязку группы к максимальному value в группе - вывести четыре поля (сумма, группа, оплата, value) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 15:31 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat LeXa NalBat 12:51по какой формуле и какому алгоритму это надо считать? bege231 14:57А если 351/(351+376+100) округлить до 2х знаков ?лишь через два часа после моего вопроса вы проронили слово "округлить". для вас это наверняка очевидно, но например я и понятия не имел, что в этой задаче используется округление. знаете, что правильно сформулированная задача - уже половина решения? почему вы не смогли четко сформулировать задачу? - дана таблица из трех полей (сумма, группа, оплата) - для каждой строки приближенно вычислить с округлением до заданной точности 10**N поле value по формуле trunc( сумма*оплата/(sum_по_группе(оплата)), N ) - для каждой группы вычислить невязку по формуле сумма-sum_по_группе(value) - для каждой группы добавить невязку группы к максимальному value в группе - вывести четыре поля (сумма, группа, оплата, value) Округление, на мой взгляд как раз наименее значимый пункт решения задачи. Меня интересует написание такого рода запросов как класса задач, что ли. А не конкретного алгоритма. Для того чтобы написать подобное для Oracle, человеку прочитавшему Т.Кайта, понадобилось бы не больше получаса. А в pg мне трудно пока придумать как решить что-то подобное просто и понятно. Надеялась что кто-нибудь сталкивался с похожими задачами расчетов. Вообщем, приношу свои извинения! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 15:56 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231Округление, на мой взгляд как раз наименее значимый пункт решения задачи.на мой взгляд, без округления в этой задаче не будет и ошибки, не будет и невязки, не будет и самой задачи. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.04.2008, 17:37 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231А тоже работает! Хотя и медленее чем join .Ну, для суммы по группе лучше, конечно же, использовать JOIN основной таблицы с агрегированным подзапросом. А скалярный подзапрос в SELECT-листе нужен для расчета накопительной суммы по группе с учетом сортировки. Типа аналог оракловой аналитической суммы: sum() over(partition by ... order by ...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 05:29 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231 Код: plaintext 1. 2. 3. 4. 1- value надо рассчитать в процентном соотношении - 3.47 * ( 351/(351+376+100)) 2 - т.о. по группе получается общая сумма 3,37 (должно быть 3,47) , невязка - 0.10 3 - невязку прибавляем к максимальной ( max =376 , прибавляем .10 к 1.56 ) На твоих тестовых данных построил табличку T1: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ID - уникальный идентификатор записи в таблице; остальные поля соответствуют твоим исходным данным: группа - номер группы; оплата - сумма оплаты; сумма - сумма для расчета процентного соотношения. Тогда можно написать запрос, который с учетом округления будет находить VALUE, расхождение суммы найденного VALUE с заданной суммой, а также помещать невязку в строку с максимальной суммой оплаты: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 08:15 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatна мой взгляд, без округления в этой задаче не будет и ошибки, не будет и невязки, не будет и самой задачи. Поля "сумма" и "оплата" - это в деньгах (руб) , а 10 знаков после запятой - это уже не деньги. Потому и приходится округлять, и считать невязки. Бабичев Сергей select count(1) from t1 t0 where t0."группа" = t1."группа" and (t0."оплата" > t1."оплата" or t0."оплата" = t1."оплата" and t0.id >= t1.id ) Как раз то что искала! Как-то так сразу до такого и не додумаешься. Теперь буду пользоваться! Спасибо огромное! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 11:17 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
bege231 Бабичев Сергей select count(1) from t1 t0 where t0."группа" = t1."группа" and (t0."оплата" > t1."оплата" or t0."оплата" = t1."оплата" and t0.id >= t1.id ) Как раз то что искала! Как-то так сразу до такого и не додумаешься. Теперь буду пользоваться! Спасибо огромное! Ну, ты, если что, сразу говори, какую из аналитических функций оракла тебе нужно переложить на ANSI-SQL-99. Приведенный кусок кода - это аналог аналитического ROW_NUMBER() over(partition by "группа" order by "оплата" desc, id desc) :) Фактически, любую другую аналитическую функцию можно реализовать при помощи такого же подхода. По крайней мере, ранжирующие функции (rank, dense_rank, row_number), функции получения предыдущей/последующей записи (lead/lag), скользящая сумма (sum() over()) реализуются в легкую. Вот только эффективность запроса при этом значительно снизится... :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 11:41 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Вот и монстр получился! Думаю следующий вопрос автора будет "как мне всё это счастье теперь оптимизировать??". Потому что если сделать план подобных запросов ох не радует! Индексы помогут лишь отчасти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 17:24 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Что-то вспомнился старый анекдот, когда психов искали, раздавая им стакан и наперсток и проверяя, как они будут из ванны с водой воду выливать. Для аналитики есть как специальные библиотеки в разных языках, так и специализированные языки. Например, postgresql-8.1-plr поможет решить и более сложные задачи. В оракле просто нет таких возможностей, потому создают доп. функции, которые являются лишь жалким подобием возможностей хорошего пакета мат. статистики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 22:12 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Если кто не понял про анекдот, подсказываю - пробку из ванны надо было выдернуть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 22:14 |
|
||
|
Аналитика в Pg
|
|||
|---|---|---|---|
|
#18+
Склонность пытаться решить любой вопрос чистым T-SQL имхо распространненый синдром. Думаю тему можно закрывать до следующего пациента с вопросом как по-постгресовски сделать что-то оракловское и чтоб не кодить никаких ХП на Си или Перле. Короче - тема раскрыта осознана и закрыта. 8-D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2008, 23:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=2004429]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 257ms |
| total: | 425ms |

| 0 / 0 |
