[ djvlajko @ 28.06.2013. 10:51 ] @
Moze li se napisati sql izraz za izdvajanje prvih 500 prirodnih brojeva, a da se pri tome ne koristi neka tabela iz neke baze podataka. Ovo mi treba za Sql2008 ... Hvala ... |
[ djvlajko @ 28.06.2013. 10:51 ] @
[ vujkev @ 28.06.2013. 11:04 ] @
Odakle da ih izdvojiš ako te podatke nemaš u tabeli?
Mislio si nešto ovako? Code (tsql): with e as ( select 1 rn union all select rn+1 from e where rn<500 ) select * from e OPTION (MAXRECURSION 500); [ djvlajko @ 28.06.2013. 12:43 ] @
Sta je moj konkretan zadatak ...
U tabeli uzorak, po odgovarajucem kriterijumu izdvajam kolonu broj_u_danu i tu ce biti npr 1, 2, 4, 5, 6, 9 .... Hteo bih da nadjem najmanji propusteni broj. Ja sam za to koristio pomocnu tabelu brojevi, sa jednom kolonom broj, koja ima 500 slogova (od 1 do 500) i uz pomoc donjeg upita dobijao rezultat kao vrednost mindan. Code: select min(broj) as mindan from brojevi where broj not in (select uzorak.broj_u_danu from uzorak where ...) Ne znam da li sam dovoljno jasan sa ovim kodom ... Svakako Vam hvala na odgovoru. [ Zidar @ 28.06.2013. 18:51 ] @
Na brzinu, problem moze da se resi ovako:
Code: -- Ovo ti da SVE nedostajuce brojeve: SELECT B.broj FROM Brojevi AS B LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj ; -- onda izaberes najmanji od njih: SELECT MIN(broj) FROM ( SELECT B.broj FROM Brojevi AS B LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj ) AS X ; Umesto tabele Brojevi mozes da koristis onaj elegantni izraz sto ti je dao Vujkev, samo promenis MAXRECURSION i ono rn<500, podesis kako tebi treba. Diskusija ponudjenog resenja: Ako je tabela Brojevi velika, recimo deset miliona brojeva, ond ce prvi kveri (LEFT JOIN) da vrati sve brojeve koji su u tabeli Brojevi, znaci i one vece od najveceg u tabeli Uzorak. Za 500 brojeva nema veze, ali za vise moze biti problem. Jos veci je problem sto se moze desiti da nemas ni jedna 'propusteni broj' u tabeli uzorci, a da ponudjeni kveri ipak vrati nesto - sve borjeve vece od najvece vrednosti U.broj_u_danu. Kveri koji nema ove nedostatke izgledao bi ovako: Code: SELECT MIN(broj) FROM ( SELECT B.broj FROM Brojevi AS B LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj WHERE B.broj <= (SELECT MAX(broj_u_danu) FROM Uzorak) ) AS X ; Tako nekako otprilike. Verujem da ces se snaci za dalje. Srecn rad ![]() [ djvlajko @ 28.06.2013. 20:50 ] @
Pogledao sam drugi kod koji Ste mi poslali (Zidar).
Taj kod uvek vraca 1. Sa left join-om cu dobiti sve brojeve od 1 pa do maksimalnog broja u tabeli uzorak. Zatim sa min(broj) dobijam najmanji tj 1 ??? Napravio sam malu testnu bazu u Access-u i upravo je tako ...... U svako slucaju mislim da ce mi kod koji je dao Vujke pomoci (probao sam i on odradjuje sta treba). Jos jednom se zahvaljujem na pomoci i veliki pozdrav ..... [ dusans @ 28.06.2013. 22:11 ] @
Ako nemaš puno ponavljanja u koloni broj_u_danu onda ovako:
Code: SELECT TOP 1 (T.broj_u_danu + 1) AS mindan FROM uzorak AS T LEFT OUTER JOIN uzorak AS S ON T.broj_u_danu + 1 = S.broj_u_danu WHERE (S.broj_u_danu IS NULL) ORDER BY T.broj_u_danu Ako imaš puno ponavljanja u koloni broj_u_danu onda bolje ovako: Code: SELECT TOP 1 (T.broj_u_danu + 1) AS mindan FROM (SELECT DISTINCT broj_u_danu FROM uzorak) AS T LEFT OUTER JOIN (SELECT DISTINCT broj_u_danu FROM uzorak) AS S ON T.broj_u_danu + 1 = S.broj_u_danu WHERE (S.broj_u_danu IS NULL) ORDER BY T.broj_u_danu Pozdrav! [Ovu poruku je menjao dusans dana 28.06.2013. u 23:32 GMT+1] [ djvlajko @ 29.06.2013. 00:11 ] @
Dusans, ovo radi ali gresi samo u slucaju kada je prvi broj u uzorcima 2 (tj nedostaje 1).
Malo je kasno, sutra cu probati da "provalim" i tu varijantu. Puno hvala ... [ Zidar @ 04.07.2013. 14:29 ] @
Izvinjavam se, moj kveri je nepotpun (kad vec nisi prilozio tabelu sa test podacima pa moramo da pisemo napamet...)
Ponovo, napamet Code: SELECT MIN(broj) FROM ( SELECT B.broj FROM Brojevi AS B LEFT JOIN Uzorak AS U ON U.broj_u_danu = B.broj WHERE B.broj <= (SELECT MAX(broj_u_danu) FROM Uzorak) -- dovde vraca SVE iz atbele Brojevi AND U.broj IS NULL -- ovo zadrazva samo one brojeve koji nedostajuu tabelio Uzorak ) AS X ; Ono sto ti je dusans dao je veoma dobro, ali mozda je teze za razumevanje. ![]() Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|