sql >> Databasteknik >  >> RDS >> Oracle

Gruppera rader baserat på kolumnsummavärde

Jag personligen skulle föredra en pl/sql-funktion för denna uppgift, men om du vill göra det i ren sql kan du använda följande fråga:

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
/

Observera att den här frågan inte söker efter matchande poster för att bygga grupper så att summan är <500 eftersom detta är nära relaterat till det så kallade ryggsäcksproblemet (s. https://en.wikipedia.org/wiki/Knapsack_problem ), vilket är nästan lätt att lösa...



  1. Hur kan jag få värden från en tabell till en annan via liknande värden?

  2. Hur får man data från en mysql-databas med javascript?

  3. Pivotbord Med 3 bord

  4. Snabbare sätt att infoga, via skript, i Oracle?