sql >> Database >  >> RDS >> Oracle

Groepeer rijen op basis van kolomsomwaarde

Ik zou persoonlijk de voorkeur geven aan een pl/sql-functie voor deze taak, maar als je het in pure sql wilt doen, kun je de volgende query gebruiken:

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
/

Merk op dat deze zoekopdracht niet zoekt naar overeenkomende items om groepen te bouwen zodat de som <500 is, aangezien dit nauw verband houdt met het zogenaamde knapzakprobleem (s. https://en.wikipedia.org/wiki/Knapzakprobleem ), wat allesbehalve eenvoudig op te lossen is...



  1. Tel rijen na het samenvoegen van drie tabellen in PostgreSQL

  2. .nextval JDBC invoegprobleem

  3. LINQPad - Verbindingsreeks naar mijn Oracle DB

  4. Opdrachtregel MySQL-query export uitvoer naar bestand werkt niet in Windows