sql >> Databáze >  >> RDS >> Oracle

Seskupit řádky na základě hodnoty součtu sloupců

Osobně bych pro tento úkol preferoval funkci pl/sql, ale pokud to chcete udělat v čistém sql, můžete použít následující dotaz:

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
/

Všimněte si, že tento dotaz nehledá odpovídající položky k sestavení skupin tak, aby součet byl <500, protože to úzce souvisí s takzvaným problémem s batohem (s. https://en.wikipedia.org/wiki/Knapsack_problem ), což je téměř snadné vyřešit...



  1. Lze MySQL bez problémů nahradit MariaDB nebo je v tomto případě potřeba něco změnit?

  2. Test na nulovou funkci s různými parametry

  3. Zápis funkce v SQL pro procházení obdobím v UDF

  4. Laravel 4 Kaskádové měkké mazání