|
|
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
Ну может и не сортировка... В общем, суть задачи: Есть таблица клиент--плательщик--месяц_выплаты--сумма_выплаты. Надо для каждого клиента определить плательщика от которого он получил последнюю выплату. Если суммы за последний месяц равны, то сравниваются суммы за предыдущий и т.д. Количество плательщиков может быть любое. Выплаты не обязательно производятся каждый месяц. Пример исходных данных: CLIENTPAYERPAY_MONTHPAY_SUMAQ330AW330AQ220AW220AW115AQ110BE225BR150BR110CT340CY340CY160CT130 Искомый результат: CLIENTPAYERAWBECY Пробовал такую конструкцию Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Результат не тот CLIENTPAYERAQBECT У кого какие мысли? Хочется сделать элегантно, без десятка вложенных запросов или переборов в цикле. Всю голову уже сломал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 15:59 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_Если суммы за последний месяц равны, то сравниваются суммы за предыдущий и т.д. Какие именно суммы? Что с чем сравнивается? хорошо бы еще и запрос с кляузой with из dual. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:07 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_Результат не тот Результат не тот потому-чтo ты нe зaдaл правило что делать eсли сумма выплаты двух или более плательщиков за последний месяц равны. Хочешь плательщика с максимальным именем - добавь Payer DESC в ORDER BY. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:18 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_Есть таблица клиент--плательщик--месяц_выплаты--сумма_выплаты. Надо для каждого клиента определить плательщика от которого он получил последнюю выплату. Если суммы за последний месяц равны , то сравниваются суммы за предыдущий и т.д. Объясните нам свою логику, что Вы имели ввиду. Пока это - в огороде бузина, а в Киеве дядька. Зачем Вам вообще равенство сумм. А если не равенство, что делать? И равенство среди плательщиков по средней сумме (типа Вася 100, Петя 200, Дима 200, Олег 300) Вас интересует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:30 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
Lary DenisКакие именно суммы? Что с чем сравнивается?Суммы выплат. Поле Pay_Sum. SY Результат не тот потому-чтo ты нe зaдaл правило что делать eсли сумма выплаты двух или более плательщиков за последний месяц равны. Хочешь плательщика с максимальным именем - добавь Payer DESC в ORDER BY. Нет, не хочу. В этом случае надо смотреть предыдущий месяц и сравнивать суммы выплат в нём. Т.е. получается рекурсивный алгоритм: 1. Ищем максимальное значение Pay_Sum за максимальный Pay_Month. Если оно одно, то значение Payer -- результат. 2. Если максимальное значение Pay_Sum несколько, то выполняем шаг 1 для Pay_Month - 1. по просьбам трудящихся запрос с исходными данными Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:41 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Прошу прощенья, недостаточно описал задачу. Есть таблица клиент(Client)--плательщик(Payer)--месяц_выплаты(Pay_Month)--сумма_выплаты(Pay_Sum). Надо для каждого клиента определить плательщика от которого он получил последнюю (с наибольшим значением Pay_Month) выплату. Если за этот месяц выплат несколько, берём с наибольшей суммой выплаты (Pay_Sum). Если суммы (значения Pay_Sum) за последний месяц равны, то сравниваются суммы (значения Pay_Sum) за предыдущий месяц и т.д. Количество плательщиков может быть любое. Выплаты не обязательно производятся каждый месяц. Сергей Арсеньев И равенство среди плательщиков по средней сумме (типа Вася 100, Петя 200, Дима 200, Олег 300) Вас интересует?Если всё было бы так просто...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:54 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_, некрасиво, но без рекурсии Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:58 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_, знаю, что неправильно, зато сходится Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. CLIENTPAYERAWBECY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:59 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:03 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
--Eugene--, а я не решился такой ответ постить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:03 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKad Код: plsql 1. Без выделенного можно обойтись. Ошибка копипаста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:05 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
--Eugene--_hz_, знаю, что неправильно, зато сходится Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. CLIENTPAYERAWBECY Это только в примере так получилось, что Payer-ы по алфавиту) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:27 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
Glays_hz_, некрасиво, но без рекурсии Код: 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. Боюсь, на боевых объёмах сервер ниасилит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:31 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKad, ваш запрос не предусматривает такие случаи SELECT 'A' AS Client, 'Q' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'W' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual тут, наверно, нужно брать любого payer, ваш запрос не вернет никакого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:43 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKad Код: 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. А это надо обдумать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:43 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKad, А еще, я, возможно неправильно понял условие, но на этих данных, запрос вернет E, а надо Q. Хотя это условие можно уточнить: после того, как в максимальный день совпали суммы для двух payer мы будем сравнивать предыдущие дни только для них или для всех? Какой результат должен получиться на примере ниже? WITH Tab AS ( SELECT 'A' AS Client, 'Q' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'E' AS Payer, 1 AS Pay_Month, 15 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'Q' AS Payer, 2 AS Pay_Month, 20 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'W' AS Payer, 2 AS Pay_Month, 20 AS Pay_Sum FROM Dual ) select client, max(payer) keep (dense_rank last order by pay_month) payer from (select client, payer, pay_month, pay_sum, row_number() over (partition by client, pay_month order by pay_sum desc) dr, count (*) over (partition by client, pay_month, pay_sum order by pay_sum ) cnt from tab ) where dr = cnt and cnt = 1 group by client; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:47 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
mraksSELECT 'A' AS Client, 'Q' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'W' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual Да, я намеренно не стал учитывать такие случаи, потому что ты поленился описать логику их обработки в своей недопостановке задачи. Значит допилишь сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:49 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKad, я не автор задачи, я не поленился придумать исключение для твоей реализации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:50 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
mraks, Тогда считай, что то сообщение адресовано топикстартеру ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:52 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
mraksА еще, я, возможно неправильно понял условие, но на этих данных, запрос вернет E, а надо Q. Хотя это условие можно уточнить: после того, как в максимальный день совпали суммы для двух payer мы будем сравнивать предыдущие дни только для них или для всех? group by client; Да, мне кажется твоя трактовка отличается от того, что хотел автор. _hz_Надо для каждого клиента определить плательщика от которого он получил последнюю выплату. Если суммы за последний месяц равны, то сравниваются суммы за предыдущий и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:55 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
_hz_, вроде, правильно Код: 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. CLIENT;PAYERA;WB;EC;Y ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:10 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
нет, неправильно :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:18 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
вот так правильно Код: 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.11.2016, 18:23 |
|
||
|
Хитрая сортировка
|
|||
|---|---|---|---|
|
#18+
AmKadmraksSELECT 'A' AS Client, 'Q' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual UNION ALL SELECT 'A' AS Client, 'W' AS Payer, 1 AS Pay_Month, 10 AS Pay_Sum FROM Dual Да, я намеренно не стал учитывать такие случаи, потому что ты поленился описать логику их обработки в своей недопостановке задачи. Значит допилишь сам. Тебе же сказано: _hz_... Если суммы за последний месяц равны, то сравниваются суммы за предыдущий и т.д. ... значит, если в месяце есть более одной одинаковой у разных PAYER-ов, - этот месяц не учитывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:35 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39357874&tid=1886906]: |
0ms |
get settings: |
6ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
141ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 437ms |

| 0 / 0 |
