sql >> Databasteknik >  >> RDS >> Mysql

Välj rader tills ett totalt belopp uppnås i en kolumn (mysql)

Det är inte vackert, men jag tror att det här gör det och kanske kan det vara grunden till något mindre krångligt. Observera att jag använder en "falsk" INNER JOIN bara för att få någon variabel initialiserad för första gången - den har ingen annan roll.

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. SQL-nycklar, MUL vs PRI vs UNI

  2. Enkel mysql-fråga angående primärnycklar och en infogning

  3. Distribuerad transaktion på länkad server mellan sql-server och mysql

  4. SQL-prestanda:WHERE vs WHERE(ROW_NUMBER)