|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Есть некий каталог групп/типов услуг: TARIFF_IDTYPE_IDCLASS11control22custom239custom349custom4102base1113type1124type2134type3202base2213type1302base3313type1325type2336type3346type4 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Определенные типы услуг являются «контейнером» для других услуг, это услуги-пакеты. Наборы этих услуг определены в таблице: TARIFF_IDPARENT_ID11101210131021203130323033303430 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
В БД есть список клиентов: CLIENT_IDNAME1client12client23client34client45client5 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
И у этих клиентов подключены услуги: CLIENT_IDSERVICE_IDTARIFF_ID1100111101011111111121211131322001222020330013330303331315502255033551212552121 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Мне нужно для пакетов услуг определить расхождения с шаблонами. Например в приведенном примере: Клиент 1 — все хорошо, у клиента подключен пакет base1 и все входящие в состав этого пакета услуги 111-113. Клиент 2 — у клиента подключен пакет base2, однако не подключены услуги, которые должны входить в этот пакет (тариф 21). Клиент 3 - у клиента подключен пакет base3, однако подключена только одна услуга пакета 331, еще три услуги не подключены (тарифы 32-34). Клиент 4 - у клиента не подключено никаких услуг. Клиент 5 - две услуги (512, 521) должны входить в состав пакета, однако сами пакеты не подключены. По итогам обработки мне нужно сделать следующее: Клиенты 1, 4 - пропустить. Клиенты 2, 3 - подключить недостающие услуги пакета. Клиент 5 - зафиксировать ошибку, у одного клиента не должны быть подключены разные пакеты одновременно. Наверное это типичная задача на сравнение двух наборов. Однако у меня с ее решением есть некоторые сложности. Вначале я получаю список клиентов и соответствующих им пакетов: CLIENT_IDBASE_ID1102203305 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Для клиентов 1-3 базовый пакет определен правильно, клиента 4 в списке нет (поскольку нет услуг), а для клиента 5 базовый пакет не задан. Теперь для этого списка я получаю эталонный набор услуг: CLIENT_IDTARIFF_IDIS_PARENT11011111121132201221311330133133233351 Код: plsql 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.
Как мне теперь выполнить сравнение наборов? Я пробовал через full outer join: Код: plsql 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.
Как мне кажется, это что-то близкое к решению, но глаз у меня уже замылился и я никак не соображу, как правильно сравнивать наборы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2019, 22:07 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B.Мне нужно для пакетов услуг определить расхождения с шаблонами.Это же вполне бизнес-задача, за которую кто-то хочет незаслуженно получить бизнес-деньги, не так ли? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2019, 07:27 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B., добрый день! авторКак мне теперь выполнить сравнение наборов? Как понял из вашего сообщения, вам удалось получить две выборки: эталон и фактическую. Можно попробовать выполнить операцию (эталон) minus (факт) над этими множествами. Таким образом удастся определить недостающие услуги для 2, 3 и убедиться, что 1 и 4 обладают полным набором. Для того, чтобы найти клиентов у которых услуги подключены без пакета нужно сделать (факт) minus (эталон), предварительно отфильтровав оба множества, чтобы остались только услуги-пакеты. В результате окажутся клиенты у которых нет ни одной подключенной услуги-пакета. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2019, 11:54 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Tesamid(эталон) minus (факт) (факт) minus (эталон) Я как раз и думал заменить два сравнения на один full join, но не получилось. Или это принципиально не получиться сделать за раз? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2019, 13:34 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B.Я как раз и думал заменить два сравнения на один full join, но не получилось. Или это принципиально не получиться сделать за раз? Не совсем понял идею сравнения двух наборов с помощью full_join. И если правильно понял условие, то можно написать промежуточные запросы в более простой форме, вот примерное решение задачи, если нужны какие-то реквизиты тарифов или клиентов, то просто джойним в нужных местах. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2019, 18:34 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B.Я как раз и думал заменить два сравнения на один full join, но не получилось. Или это принципиально не получиться сделать за раз? Элементарно. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2019, 23:25 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
SkilledJuniorЭлементарно.Демонстрация абстрактного синтаксиса full join есть в документации, а предметного в исходном сообщении темы. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2019, 06:47 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
-2-, Берем выборки которые хотел сравнить автор темы, правим эталонную чтобы она действительно была похожа на эталонную и вуаля, получаем все расхождения наборов данных или ты хочешь чтобы кто то решил за топикстартера его бизнес задачу под ключ? Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2019, 22:52 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Tesamidвот примерное решение задачи, если нужны какие-то реквизиты тарифов или клиентов, то просто джойним в нужных местах. Да, истина где-то рядом, но критерии сравнения для запроса у меня не получается придумать. Наверное буду решать построчным анализом на клиенте. SkilledJuniorЭлементарно. Не вижу принципиальных отличий от того, что я написал в самом начале. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 14:18 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B.Tesamidвот примерное решение задачи, если нужны какие-то реквизиты тарифов или клиентов, то просто джойним в нужных местах. Да, истина где-то рядом, но критерии сравнения для запроса у меня не получается придумать. Наверное буду решать построчным анализом на клиенте.Даже это лучше делать на сервере: не будет сетевых задержек и дополнительной нагрузки на сеть. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 14:48 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Да, возможно и так. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 15:19 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Alibek B.Наверное это типичная задача на сравнение двух наборов.Скорее это типичная задача на outer join partition by. Поскольку для каждой встречающейся комбинации (клиент, пакет) надо присоединить все услуги этого пакета и посмотреть чего не хватает. Тонкость в том, что join partition by дублирует некоторый фиксированный набор для каждой комбинации. Поэтому приходится дублировать для (клиент, пакет) услуги всех пакетов и потом оставлять нужный пакет фильтруя Код: plaintext
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Вероятно, ты предварительно еще захочешь сделать проверку на число пакетов на клиента, но я, думаю, справишься. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 18:12 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
КобанчегСкорее это типичная задача на outer join partition by.Принимая во внимание особенности задания иерархии надо добавить строки для "корней" привязанные к null, чтоб client 2 не пропадал. Код: plsql 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.
Кобанчегпредварительно еще захочешь сделать проверку на число пакетов на клиентаУчитывая, что outer join partition by как раз переписывается через дополнительное соединение с distinct (или группировкой), то здесь можно пойти этим путём, включив во вспомогательную inline view проверку на число parent. Код: plsql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 19:05 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Кобанчег Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 19:09 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Спасибо, завтра поэкспериментирую. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 20:42 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
SkilledJuniorНе вижу принципиальных отличий от того, что я написал в самом начале. Если соберешь эталон соответствующим образом, тогда сможешь сравнивать, а так у тебя факт имеет одну структуру, эталон другую. Здесь пример, какой эталон ты должен был собрать на представленный тобой факт 21909017 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 22:29 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
Шож ты тычешь свой full join по поводу и без, юное бездарование. Господину Алибеку не надо проверять на наличие несуществующих услуг, ему надо найти криво оформлнные пакеты услуг. Перед рассуждениями про сферические эталоны в вакууме попытайся еще раз осилить постановку. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 23:00 |
|
Подскажите, как правильно сравнивать между собой два набора данных
|
|||
---|---|---|---|
#18+
КобанчегШож ты тычешь свой full join по поводу и без, юное бездарование. Господину Алибеку не надо проверять на наличие несуществующих услуг, ему надо найти криво оформлнные пакеты услуг. Перед рассуждениями про сферические эталоны в вакууме попытайся еще раз осилить постановку. Смешные вы, ну мастерите дальше ... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2019, 23:29 |
|
|
start [/forum/topic.php?fid=52&msg=39827284&tid=1882387]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 18ms |
total: | 178ms |
0 / 0 |