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

Upit za izdvajanje prvih 500 prirodnih brojeva

[es] :: MS SQL :: Upit za izdvajanje prvih 500 prirodnih brojeva

[ Pregleda: 2654 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

djvlajko

Član broj: 89354
Poruke: 294
*.dynamic.isp.telekom.rs.



Profil

icon Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 10:51 - pre 80 meseci
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 ...
 
Odgovor na temu

vujkev
Beograd

Član broj: 8072
Poruke: 1311
*.dynamic.isp.telekom.rs.



+99 Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 11:04 - pre 80 meseci
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);

Naučio sam...
Da je važnije biti ljubazan nego biti u pravu
 
Odgovor na temu

djvlajko

Član broj: 89354
Poruke: 294
*.dynamic.isp.telekom.rs.



Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 12:43 - pre 80 meseci
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.

 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+78 Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 18:51 - pre 80 meseci
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
 
Odgovor na temu

djvlajko

Član broj: 89354
Poruke: 294
*.dynamic.sbb.rs.



Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 20:50 - pre 80 meseci
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 .....



 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1326
*.dynamic.sbb.rs.



+306 Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva28.06.2013. u 22:11 - pre 80 meseci
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]
 
Odgovor na temu

djvlajko

Član broj: 89354
Poruke: 294
*.dynamic.sbb.rs.



Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva29.06.2013. u 00:11 - pre 80 meseci
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 ...
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+78 Profil

icon Re: Upit za izdvajanje prvih 500 prirodnih brojeva04.07.2013. u 14:29 - pre 80 meseci
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.

 
Odgovor na temu

[es] :: MS SQL :: Upit za izdvajanje prvih 500 prirodnih brojeva

[ Pregleda: 2654 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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