Oracle
 sql >> база данни >  >> RDS >> Oracle

Групирайте редове въз основа на сумата на колоната

Аз лично бих предпочел pl/sql функция за тази задача, но ако искате да я направите в чист sql, можете да използвате следната заявка:

WITH ord AS (SELECT id, num_rows, ROWNUM ord FROM myTable)
   , rek(ord, id, num_rows, sum_rows, groupId) AS 
         (SELECT ord, id, num_rows, num_rows, 1 FROM ord WHERE ord = 1
          UNION ALL
          SELECT rek.ord +1
               , ord.id
               , ord.num_rows
               , CASE WHEN rek.sum_rows + ord.num_rows > 500
                      THEN ord.num_rows
                      ELSE rek.num_rows + ord.num_rows
                END
               , CASE WHEN rek.sum_rows + ord.num_rows > 500
                      THEN rek.groupID + 1
                      ELSE rek.groupID
                 END
            FROM rek
            JOIN ORD
              ON ord.ord = rek.ord+1)
SELECT id, num_rows, groupid
  FROM rek
/

Обърнете внимание, че тази заявка не търси съвпадащи записи за изграждане на групи, така че сумата да е <500, тъй като това е тясно свързано с така наречения проблем с раницата (s. https://en.wikipedia.org/wiki/Knapsack_problem ), което е почти лесно за решаване...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SELECT ТОП 10 записа

  2. Стартирайте съхранена процедура на SQL Server чрез връзка към база данни от Oracle

  3. Как да извлечете група от регулярен израз в Oracle?

  4. Какъв тип данни на Java съответства на типа данни на Oracle SQL NUMERIC?

  5. Грешка Ora 12154