sql >> Databasteknik >  >> RDS >> Mysql

välj 30 slumpmässiga rader där summa =x

Det närmaste svaret jag kan ge är detta

set @cnt = 0;
set @cursum = 0;
set @cntchanged = 0;
set @uqid = 1;
set @maxsumid = 1;
set @maxsum = 0;
select 
    t.id,
    t.name,
    t.cnt
from (
    select 
        id + 0 * if(@cnt = 30, (if(@cursum > @maxsum, (@maxsum := @cursum) + (@maxsumid := @uqid), 0)) + (@cnt := 0) + (@cursum := 0) + (@uqid := @uqid + 1), 0) id, 
        name,  
        @uqid uniq_id,
        @cursum := if(@cursum + price <= 500, @cursum + price + 0 * (@cntchanged := 1) + 0 * (@cnt := @cnt + 1), @cursum + 0 * (@cntchanged := 0)) as cursum, if(@cntchanged, @cnt, 0) as cnt  
    from (select id, name, price from items order by rand() limit 10000) as orig
) as t

where t.cnt > 0 and t.uniq_id = @maxsumid
;

Så hur fungerar det? Först väljer vi 10k slumpmässigt ordnade rader från objekt. Efter det summerar vi priser på artiklar tills vi når 30 artiklar med summan mindre än 500. När vi hittar 30 artiklar upprepar vi processen tills vi går igenom alla 10 000 utvalda artiklar. När vi hittar dessa 30 föremål sparar vi maximalt hittat belopp. Så i slutet väljer vi 30 objekt med störst summa (vilket betyder den som är närmast målet 500). Jag är inte säker på om det var vad du ursprungligen ville ha, men att hitta den exakta summan av 500 skulle kräva för mycket ansträngning på DB-sidan.



  1. APPEND_ONLY_STORAGE_INSERT_POINT-spärren

  2. Starka referensmarkörer med tabellbaserad postdatatyp

  3. Hur man klona R12.2 miljö

  4. Använder avancerade Oracle JDeveloper-funktioner för MySQL-databaser