Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть такая задача: Есть ЛЮДИ и есть КАТЕГОРИИ. Связаны они как многие-со-многими. Нужно иметь возможность показать количество ЛЮДЕЙ в КАТЕГОРИИ. В таком виде все понятно - записываем в таблицу фактов все факты о том, что у ЧЕЛ. есть КАТ. и агрегируем по DISTINCT COUNT. Проблемы начинаются тогда, когда возникает вопрос "Сколько ЛЮДЕЙ относятся ОДНОВРЕМЕННО к 2 или более определенным КАТЕГОРИЯМ" Есть идея для каждой категории ввести свое измерение со значениями "Есть/Нет", но при этом мы привязываем стуктуру таблицы фактов к составу набора КАТЕГОРИЙ. Может, есть какие-нибудь более простые решения? Кто-нибудь сталкивался с такой задачей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 12:45 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Я такие задачи решаю в OLAP-клиенте Cognos PowerPlay с помощью функции Свертка (поскольку показатель типа Distinct Count - неаддитивен, и его нельзя складывать, а можно только сворачивать). При этом OLAP-сервер тоже надо с умом выбирать - не все сервера отработают операцию свертки - по крайней мере MS AS научится это делать только с выходом Юкона (где-то через год). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 14:01 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
MS AS замечательно "сворачивает", как вы выразились, при помощи той самой агрегации DISTINCT COUNT. Вопрос был в том, как вычислить число элементов в одной "свертке", которые при этом попадают в другую "свертку". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 14:17 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
To Andronov: MS AS замечательно "сворачивает", как вы выразились Действительно, Ваша задача посложнее чем обычная свертка... Рассмотрим следующий пример: Человек, Категория Иванов, Слесарь Иванов, Студент Петров, Слесарь Петров, Кассир Сидоров, Кассир Слесарей - 2 Студентов - 1 Кассиров - 2 Правильно ли я понимаю, что Вам надо получить: людей которые являются и слесарями и кассирами - 1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 14:41 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Абсолютно верно. Слесарь-кассир - 1 - Петров. Еще лучше было бы иметь возможность спрашивать примерно так: Сколько у нас слесарей? - 2 А сколько из них кассиров? - 1 Приемлемое количество таких уровней для нашей задачи - не меньше пяти. Т.к. анализируется информация про примерно миллион человек, сделать в кубе 5 измерений "Категория" не представляется возможным - в таблице фактов получится 1000000 5 записей для каждой загрузки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:04 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
SQL использовать не пробовали? Задача тривиальная. SQL напишет и первоклассник. Можете навесить Microstrategy - получите тот же SQL, только визуально построенный. И не придётся отдельные измерения городить для разных категорий. С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:17 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
А вот в этом месте поподробнее, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:26 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Я не совсем понял, какой SQL имелся ввиду. Кроме того, что надо народ считать по категориям, нужно это же число людей анализировать еще по куче всяких критериев. Как оптимальный вариант было решено построить куб и отдать для анализа пользователям. Конечно можно написать полсотни статических отчетов с кучей параметров, но это долго, дорого и неудобно. С Microstrategy никогда не работал, поэтому не могу оценить, насколько все это реализуемо. Если есть не слишком большое описание - буду очень благодарен за ссылку на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:32 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
а число категорий фиксировано? или хотя бы прогноз их числа на обозримое время есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:43 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Категории могут добавляться, но можно с уверенностью сказать, что их число не станет в ближайшие года три превышать 300. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 16:49 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Old NickА вот в этом месте поподробнее, пожалуйста. Ну, на самом деле это - классическая задача анализа потребительской корзины в розничной торговле. Или, в общем виде, "анализ ассоциаций". В общем виде задача сложнее и решают её продукты класса data mining. Это поиск двух (или более) категорий, которые часто встречаются вместе. В таком виде ни OLAP, ни SQL эту задачу запросто не решит. Однако, если мы ищем только пары, и обе категории в паре нам известны, то не кажется ли вам, что задача решается, действительно просто? Ведь всё известно, надо только сосчитать. Для примера приведу отчёт, который я сделал на Microstrategy на примере tutorial-проекта, который входит в инсталляцию. Код: plaintext 1. 2. 3. 4. 5. 6. 7. В первом столбце - названия продуктов, во втором - количество клиентов, купивших эти продукты, в третьем - количество клиентов, которые при этом купили ещё один продукт, который я задал в качестве параметра отчёта. При запуске отчёта мне предлагается выбрать этот продукт. Вот SQL, который при этом генерируется (база на MS Access): Код: 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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. Вот и всё - ничего сложного. Отчёт делается за 3 минуты. Если надо ещё какие-то критерии добавить в отчёт - тоже не проблема. Microstrtategy - довольно мощный инструмент. А реляционные СУБД в задачах на Distinct Count не уступают MOLAP-серверам (как мы уже выяснили в результате дискуссии с Владимиром Ивановым в этом форуме). С уважением, Константин Лисянский http://lissianski.narod.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 19:26 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Константин Лисянский А реляционные СУБД в задачах на Distinct Count не уступают MOLAP-серверам (как мы уже выяснили в результате дискуссии с Владимиром Ивановым в этом форуме). Я бы даже сказал что хорошо превосхдят. (пока) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2004, 23:20 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
To Andronov: Еще лучше было бы иметь возможность спрашивать примерно так: Сколько у нас слесарей? - 2 А сколько из них кассиров? - 1 Хотя такую задачудействительно очень удобно решать с помощью продуктов Query & Reporting (Cognos Impromptu/ReportNet, Microstrategy, BO и т.п.), я могу Вас понять - поскольку хочется получить не только статичный отчет, но и возможность интерактивного анализа с высокой скоростью. Поэтому пока могу предложить такой вариант: Выводите в OLAP-отчете в строки всех людей В столбец сначала выводите категорию Слесарей - и в колонке будут либо нули, либо единички, и внизу - общий итог (сколько всего слесарей. Далее выводите вторую колонку - студенты. И далее перемножаете в OLAP-клиенте эти колонки друг на друга. В итоге если у человека единичка и по слесарю, и по студенту - получится единичка, если либо по слесарю либо по студенту - ноль - тогда в итоге будет ноль. Понятен подход? P.S. При миллионе строк в OLAP-отчете (если у вас миллион людей) не каждый OLAP-клиент это потянет. Cognos PowerPlay User я тестировал на миллионе строк и тысяче столбцов в отчете... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2004, 09:55 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Задачи Distinct Count бывают разные и некоторые из них в AS2K действительно не решаются. Те которые решаются если модель построена проавильно может превосходить реляционные базы на несколько порядков, но почти всегда имеют производительность хуже чем обычное суммирование. В следующей версии имеется имплеметнация many-to-many измерения, которое предназначена точно для сформулированной вами задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 12:09 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Александр БергерВ следующей версии имеется имплеметнация many-to-many измерения, которое предназначена точно для сформулированной вами задачи. Ну вот, пошло о будущей версии в настоящем времени и без ссылки на открытые источники - вызовет ли ваш пост неодобрямс ваших коллег с MSFT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 12:30 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
2 backfire Ссылка была в соседней ветке :-) Последний постинг. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 13:09 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
LordOfSilence2 backfire Ссылка была в соседней ветке :-) Последний постинг. ;-) Да я все видел :-)))))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 13:15 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
Я это решил, с помощью mdx выражения такого вида: count(filter(nonemptyCrossJoin(Descendants([тттт].CurrentMember,[тттт].[dddd])),[Measures].[Колво]>1)) Спускаемся до объекта сравнения, проверяем сколько имеет значений, и подсчитываем их кол-во ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 20:46 |
|
||
|
Интересная задача при связи "многие-ко-многим"
|
|||
|---|---|---|---|
|
#18+
2 Jurii И как это работает на миллионе строк? У меня похожая ситуация. Клиент группирует миллион строк быстро, а вот вытаскивается на клиента этот миллион довольно медленно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2004, 14:09 |
|
||
|
|

start [/forum/topic.php?fid=49&msg=32566344&tid=1872491]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 258ms |
| total: | 440ms |

| 0 / 0 |
