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. plpgsqlを介してPostgresからテーブルの主キーを取得するにはどうすればよいですか?

    2. MySQLのパーセンテージ

    3. mysqlコマンドラインで高精度のクエリ時間を確認するにはどうすればよいですか?

    4. Laravel PDOException SQLSTATE[HY000][1049]不明なデータベース'forge'