Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru

[es] :: MySQL :: Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru

[ Pregleda: 1888 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

adaxx
Beograd

Član broj: 214567
Poruke: 68
*.mbb.telenor.rs.



Profil

icon Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru23.11.2015. u 17:28 - pre 102 meseci
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 ?
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru24.11.2015. u 08:56 - pre 102 meseci
Da je u pitanju Postgres, možda bih mogao da pomognem (treba mi self join nad subquery-jem). :(
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru24.11.2015. u 09:19 - pre 102 meseci
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.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru24.11.2015. u 09:58 - pre 102 meseci
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.
 
Odgovor na temu

[es] :: MySQL :: Selektovanje slucajnih redova u tabeli koji zbir cene ne prelazi odredjenu cifru

[ Pregleda: 1888 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.