Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Grupuj wiersze na podstawie wartości sumy kolumny

Osobiście wolałbym funkcję pl/sql do tego zadania, ale jeśli chcesz to zrobić w czystym sql, możesz użyć następującego zapytania:

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
/

Zauważ, że to zapytanie nie wyszukuje pasujących wpisów do budowania grup, których suma wynosi <500, ponieważ jest to ściśle związane z tak zwanym problemem plecakowym (s. https://en.wikipedia.org/wiki/Knapsack_problem ), co nie jest łatwe do rozwiązania...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Poddźwiękowe wsparcie dla Oracle ODP.NET?

  2. Czy globalnie podzielony indeks jest lepszy (szybszy) niż indeks niepartycjonowany?

  3. C#:Przekaż typ zdefiniowany przez użytkownika do procedury składowanej Oracle

  4. Jak czytać kolumnę CLOB w Oracle przy użyciu OleDb?

  5. Czy istnieje sposób na zainstalowanie Javy na Oracle 11g XE?