[ adaxx @ 23.11.2015. 17:28 ] @
Ne znam dal sam bas pravi naslov dao ali pokusacu da objanim.
Imam sledecu tabelu u bazi:
Code:
id          month          price
-------------------------------------- 
1           12             74.00
2           11             27.00
3           12             35.00
4           12             85.00
5           12             38.00
6           04             45.00
7           03             27.00
8           12             23.00
9           12             45.00
10          03             36.00
11          12             67.00
12          06             45.00
13          12             23.00
14          12             35.00


Kako izabrati slucajne redove iz tabele a da zbir kolone price bude izmedju 100 i 150, na primer na prvi upit da dobijem ovo:
Code:
id          month          price
-------------------------------------- 
1           12             74.00
5           12             38.00
14          12             35.00


znaci dobio sam zbir 147

na sledeci upit primer dobijem ovo:

Code:
id          month          price
-------------------------------------- 
3           12             35.00
5           12             38.00
8           12             23.00
14          12             35.00


i uvek da mi izbaci random rows ali da zbir bude izmedju 100 i 150 ili npr. max 150, ili <= 150 ili kako vec...
Pokusao sam nesto tipa:

Code:
SELECT id,month,price,SUM(price) 
FROM orders 
WHERE month = '12' AND SUM(price) < 150 AND SUM(price) > 100
ORDER BY rand()

ali nije to to,onda sam nasao nesto ovako na nekom forumu, radi ali nece da ga pomesa (random), mozda moze ovo malo i vama da pomogne:

Code:
SELECT 
  O.id,
  O.month,
  O.price,
  (SELECT
     sum(price) FROM orders 
   WHERE month = '12'  AND id <= O.id ) 'Total' 
FROM orders O WHERE month = '12' 
HAVING Total <=150


googlam vec dva dana i ne mogu da resim, da li moze neko malo da pomogne ?
[ jablan @ 24.11.2015. 08:56 ] @
Da je u pitanju Postgres, možda bih mogao da pomognem (treba mi self join nad subquery-jem). :(
[ djoka_l @ 24.11.2015. 09:19 ] @
U knjizi "SQL Antipatterns", 16. poglavlje od stranica 169 do 175 upravo se to objašnjava. Naravno, tvoj prvi kveri je upravo antipatern koji je loš (order by rand).
https://pragprog.com/book/bksqla/sql-antipatterns

Takođe i sama postavka zadatka je loša. Recimo, ako 3 slučajna sloga daju zbir 101, a uz četvrti zbir bude 147 pitanje je da li treba da uzmeš 3 ili 4 sloga? I jedan i drugi slučaj zadovoljavaju postavku zadatka, onako kako si ti opisao, ali nije jasno da li postoji još neki drugi kriterijum.

Nije ni jasno, recimo, koliki je skup podataka iz kojeg treba da se izvlače slučajni redovi. Nije isto rešavanje problema ako imaš za mesec = 12 nekoliko desteina slogova ili nekoliko miliona slogova.

Takođe, problem ne treba da se (u slučaju MySQL baze) rešava jednim upitom već u aplikaciji.
Recimo, jedan pristup je da učitaš SVE slogove za month=12, nađeš njihov broj, i onda generišeš slučajne indekse niza u koje si smestio rezulat da bi izvukao pojedine redove.

Dalje, nije ni jasno da li ti odgovara da jednom izvuče slogove 1, 2 i 3, a drugi put 3, 2, 1, tj. da li ti je bitan redosled ili nije.
[ jablan @ 24.11.2015. 09:58 ] @
Uspeo sam.

Code:
select id, val, (select sum(val) from tabela where encrypt(id, 'salt') <= encrypt(t.id, 'salt')) s from tabela t having s < 40 order by s;


Salt je random string koji unosiš iz aplikacije. Možeš probati sa drugim sličnim funkcijama umesto encrypt.

Inače, slažem se sa Đokom, u pitanju je antipattern i trebalo bi ga rešiti drugačije.