sql >> Databáze >  >> RDS >> Mysql

Vybírejte řádky, dokud nedosáhnete celkové částky ve sloupci (mysql)

Není to hezké, ale myslím, že tohle to dělá a možná to může být základ něčeho méně těžkopádného. Všimněte si, že používám „falešný“ INNER JOIN jen proto, abych poprvé inicializoval nějakou proměnnou – neplní žádnou jinou roli.

SELECT ID,
       supplier,
       qty,
       cumulative_qty
FROM
(
    SELECT
        ID,
        supplier,
        qty,
        -- next line keeps a running total quantity by supplier id
        @cumulative_quantity := if (@sup <> supplier, qty, @cumulative_quantity + qty) as cumulative_qty,
        -- next is 0 for running total < 5 by supplier, 1 the first time >= 5, and ++ after
        @reached_five := if (@cumulative_quantity < 5, 0, if (@sup <> supplier, 1, @reached_five + 1)) as reached_five,
        -- next takes note of changes in supplier being processed
        @sup := if(@sup <> supplier, supplier, @sup) as sup
    FROM
    (
        --this subquery is key for getting things in supplier order, by descending id
        SELECT *
        FROM `sample_table`
        ORDER BY supplier, ID DESC
     ) reverse_order_by_id
    INNER JOIN
    (
        -- initialize the variables used to their first ever values
        SELECT @cumulative_quantity := 0, @sup := 0, @reached_five := 0
    ) only_here_to_initialize_variables
) t_alias
where reached_five <= 1 -- only get things up through the time we first get to 5 or above.


  1. Funkce vs uložené procedury

  2. android.content.res.Resources$NotFoundException:ID zdroje řetězce #0x2 Databáze

  3. Jak funguje LOWER() v MariaDB

  4. Jak rozdělit řetězec v MySQL