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

Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)

[es] :: Access :: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)

[ Pregleda: 3429 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)31.12.2003. u 15:12 - pre 247 meseci
Srecna Nova godina :-)

Ovo nije pitanje, nego hocu da podelim jedno interesantno resenje sa kolegama.

Ima jedan Microsoft forum, gde ljudi pitaju pitanja iz svih mogucih oblasti. Forum je http://communities.microsoft.com/newsgroups/default.asp

Na oblasti Access Queries bilo je pitanje "Kako napraviti kveri koji vraca slucajni uzorak". Pitanje se pojavljivalo i ranije kojekuda ali nikad odgovor nije bio elegantan kao ovaj:

'Ako je CustomerID pozitivan jedinstveni broj (kao autonumber na primer) onda
SELECT TOP 5 PERCENT Customers.*
FROM Customers
ORDER BY Rnd([CustomerID]);

Ako ne postoji numericki jedinstveni kljuc, moze i ovako:
SELECT TOP 5 PERCENT Customers.*
FROM Customers
ORDER BY Rnd(1 + Len([CompanyName] & ""));

Rnd() zahteva argument koji je >=0 i ne moze biti NULL.

I to je to. Access prvo sortira ceo set po zadatom pravilu i onda odvoji TOP X%.
Moguce je da neki drugi dijalekti prvo vrate TOP X% pa tek onda sortiraju. U tom slucaju prikazani metod za randomizaciju ne bi vazio. Cini mi se da Oracle radi na ovaj drugi nacin, ali nisam siguran. Microsoft SQL pak nema Rnd() funkciju pa nisam siguran da li bi ovo radilo u MS SQL. Ako neko zna kako - podelite trik sa narodom.

:-)






[Ovu poruku je menjao degojs dana 06.01.2004. u 16:53 GMT]
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access31.12.2003. u 17:45 - pre 247 meseci
SQL Server nema Rnd, ali ima RAND funkciju :)

SELECT TOP 1 * FROM Table
WHERE AutoID NOT IN (SELECT TOP 6 AutoID FROM Table);

Ovim ćeš dobiti 7. zapis u tabeli (nevezano za vrednosti u AutoID koloni). Naravno stavljanjem slučajnog broja posle TOP u sub-queriy-ju ćeš dobiti i slučajni zapis. Pošto ne može promenjiva da se koristi posle TOP moraćeš da pogledaš dinamičke upite u SQL Serveru (vidi EXEC i sp_executesql). Ovo rešenje podrazumeva da imaš AutoID kolonu koja je PK.

Takođe, sretna Nova Godina.
Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access31.12.2003. u 18:05 - pre 247 meseci
Evo probaj ovako, napisao sam upit pošto jeste interesantno :) U primeru sam koristio tabelu koja se zove "tblTags" i ima 2 polja AutoID (primary key, identity), i još jedno polje koje i nije bitno (sadrži neke NVarChar vrednosti). Radi izgleda :)

Code:

DECLARE @tablename VARCHAR(20), @query NVARCHAR(200)
DECLARE @rnd int;
DECLARE @ctr int;

SET @tablename = 'tblTags'

SELECT @ctr=COUNT(AutoID) FROM tblTags; -- koliko zapisa imamo u tabeli..

SET @rnd = RAND () * @ctr - 1 ; -- slucajan broj od 0 do broj zapisa - 1

SET @query = N'SELECT TOP 1 * FROM '+ @tablename +
        ' WHERE AutoID NOT IN ( SELECT TOP ' + CAST( @rnd AS nvarchar ) + 
        ' AutoID FROM ' + @tablename + ')';


EXEC (@query);


Commercial-Free !!!
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access06.01.2004. u 18:52 - pre 247 meseci
Hvala na odgovoru! Radi. Takodje, lep primer kako se prave dinamicki upiti. Medjutim, dato resenje daje samo jedan rekord. Ponudjeni Access kveri daje zadati broj rekorda generalno >1.

Posto sam ja nekad bio inzenjer, prelazem jedno ne-matematicko resenje - linkovati SQL tabelu na Access i onda primeniti Access kveri. Radi lepo sa nekim manjim brojem rekorda. Probao sam sa 300,000 i radi, ali se ceka do 30 sekundi do pet minuta da se vide rezultati, zavisno od stanja mreze, strukture tabele, izbora polja po kome se randomizuje i slicno.

Pretpostavljam da moze da se napravi resenje koje vraca vise rekorda, pomocu SQL user defined functions (UDF). Elem, UDF mogu da vrate tabelu kao output, pa ako se tvoja procedura pozove unutar funkcije zadati broj puta, i sve spakuje u lokalnu temp tabelu, pa ond funkcije varti tu tabelu itd..... Ja bih radije da to odradi jedan ili vise kverija, bez proceduralnog programiranja (varijable, petlje).

Hristos se rodi!

:-)
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access06.01.2004. u 19:33 - pre 247 meseci
Samo zameni ono konstantno "SELECT TOP 1" sa nekim brojem npr. "SELECT TOP 5" pa ćeš dobiti 5 zapisa ili opet iskoristi RAND funkciju ako trebaš slučajan broj zapisa.

Dakle, ovako nekako ako ti treba slučajan broj zapisa:
Code:

DECLARE @rnd int;
DECLARE @ctr int;
DECLARE @recs int;

SET @tablename = 'tblTags'

SELECT @ctr=COUNT(AutoID) FROM tblTags; -- koliko zapisa imamo u tabeli..

SET @recs = RAND() * @ctr + 1; -- broj zapisa koje prikazujemo ( +1 potrebno da ne bi vratio 0 )
SET @rnd = RAND () * @ctr; -- slucajan broj od 0 do broj zapisa - 1

SET @query = N'SELECT TOP ' + CAST( @recs AS nvarchar) + ' * FROM '+ @tablename + 
    ' WHERE AutoID NOT IN ( SELECT TOP ' + CAST( @rnd AS nvarchar ) + 
    ' AutoID FROM ' + @tablename + ')';

EXEC (@query);


Vaistinu se rodi! :)

/edit - degojs:
SET @rnd = RAND () * @ctr; -- slucajan broj od 0 do broj zapisa - 1

Dakle, nije potrebno ... * @ctr - 1. Ispravka vredi i za prvi odgovor.



[Ovu poruku je menjao degojs dana 06.01.2004. u 18:08 GMT]
Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)06.01.2004. u 19:51 - pre 247 meseci
Naravno, ako želiš da uvek dobiješ npr. 5 zapisa mogao bi da ideš sa SELECT TOP 5, ali tada treba paziti da onaj pod-upit ne počinje previše blizu kraja tabele - neće ni imati 5 zapisa da vrati. Dakle, ako trebaš konstantan broj zapisa, moraćeš da proveriš da je @rnd <= @ctr - @recs.

Ovako:
Code:

DECLARE @tablename VARCHAR(20), @query NVARCHAR(200)
DECLARE @rnd int;
DECLARE @ctr int;
DECLARE @recs int;

SET @tablename = 'tblTags'

SELECT @ctr=COUNT(AutoID) FROM tblTags; -- koliko zapisa imamo u tabeli..

SET @recs = RAND() * @ctr + 1;
SET @rnd = RAND () * (@ctr - @recs + 1);

IF @rnd < 0 
    SET @rnd = 0;

SET @query = N'SELECT TOP ' + CAST( @recs AS nvarchar) + ' * FROM '+ @tablename +
    ' WHERE AutoID NOT IN ( SELECT TOP ' + CAST( @rnd AS nvarchar ) + 
    ' AutoID FROM ' + @tablename + ')';
EXEC (@query);

Ovo vraća slučajan broj zapisa, veći od 1.


Ako želiš da vrati uvek određeni broj zapisa, npr. 5, promeni liniju:
Code:
SET @recs = RAND() * @ctr + 1;

tako da izgleda ovako:
Code:
SET @recs = 5;


Svakako, dodatna pretpostavka je da u tabeli imamo minimalno onoliko zapisa koliko tražimo (u ovom slučaju 5).

[Ovu poruku je menjao degojs dana 06.01.2004. u 18:12 GMT]
Commercial-Free !!!
 
Odgovor na temu

degojs

Član broj: 4716
Poruke: 5096



+51 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)06.01.2004. u 20:20 - pre 247 meseci
Citat:
Posto sam ja nekad bio inzenjer, prelazem jedno ne-matematicko resenje - linkovati SQL tabelu na Access i onda primeniti Access kveri. Radi lepo sa nekim manjim brojem rekorda. Probao sam sa 300,000 i radi, ali se ceka do 30 sekundi do pet minuta da se vide rezultati, zavisno od stanja mreze, strukture tabele, izbora polja po kome se randomizuje i slicno.


Uhhh! :) A moraš li baš da prevlačiš toliki broj zapisa?
Commercial-Free !!!
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)07.01.2004. u 15:38 - pre 247 meseci
Zaista ti hvala na trudu! Pre nego sto nastavimo diskusiju, molim te da znas da je ovo samo jedna zanimljiva mozgalica, nije skolski zadatak niti nesto na poslu. Ako nemas previse vremena, ne moras da ga trosis na ovo, nista nije kriticno. Pokusacu da kopam i na drugim mestima, jer me problem zanima, cisto akademski.

Hvala ti puno na trudu i vremenu.

:-)


Nastavak diskusije:
Pogledao sam i testirao resenje koje vraca vise od jednog rekorda i utvrdio da
a) vraceni uzorci nisu slucajni, zaviose od broja @rnd = RAND () * @ctr
b) Ako se fiksira broj slogova koji zelim das dobijem (@recs), uglavnom vraca toliko slogova ali oni nisu slucajni, kontinualni niz brojeva X,X+1,X+2,X+3 (X su AutoID), gde prvi broj u nizu zavisi od @rnd .

Testirao sam proceduru na tabeli Projects, koja ima samo jedno polje (ProjectID, INT) i ima ukupno 23 sloga.

Tvoju originalnu proceduru promenio sam minimalno. Dodao sam deklaracije koje nedostaju i fiksirao broj slogova koje zelim da vidim na kraju. Trazio sam 3 slucajno odabrana sloga iz tabele Projects (SET @recs = 3)
Saljem ti skriptu tacno onako kako sam je izvrsavao u Query Analyzer prozoru.

Ispod skripte ti saljem 23 rekorda iz moje tabele Projects. Ako nekoliko puta za redom izvrsis skriptu, videces sta se desava.

---- Script BEGIN

DECLARE @rnd int;
DECLARE @ctr int;
DECLARE @recs int;
DECLARE @tablename varchar(255);
DECLARE @query varchar(1000);

---- Zidar promenio source table
SET @tablename = 'Projects'
SELECT @ctr=COUNT(ProjectID) FROM Projects; -- koliko zapisa imamo u tabeli..

---- Zidar promenio @recs, fiksirano na 3
SET @recs = 3 --- RAND() * @ctr + 1; -- broj zapisa koje prikazujemo ( +1 potrebno da ne bi vratio 0 )
SET @rnd = RAND () * @ctr; -- slucajan broj od 0 do broj zapisa - 1

----- dodao Zidar:
SELECT TrebaDaVrati=@recs, SlucajanBroj=@rnd, TableSize=@ctr

SET @query = 'SELECT TOP ' + CAST( @recs AS nvarchar) + ' * FROM '+ @tablename +
' WHERE ProjectID NOT IN ( SELECT TOP ' + CAST( @rnd AS nvarchar ) +
' ProjectID FROM ' + @tablename + ')';

---- Zidar dodao, da vidim @query
SELECT Query=@query

EXEC (@query);
SELECT 'End'

---- Script END

Podaci u tabeli Projects:
ProjectID
-----------
1
2
3
4
5
6
7
8
9
10
16
17
18
19
20
21
22
23
24
25
26
27
28


 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.eqao.com



+79 Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)07.01.2004. u 17:37 - pre 247 meseci
neces mi verovati kako je prosto!

Postavio sam isto pitanje na http://communities.microsoft.com/newsgroups/default.asp? i u roku od 3 (tri) minuta dobio dva identicna odgovora:


SELECT TOP 3 * FROM Projects ORDER BY NewID()

Ovaj SQL statement ce raditi sa bilo kojom tabelom, nezavisno od strukture (ima/nema AutoiD, tipovi polja itd)

Proverio sam na tabeli od 180,000 slogova da izvucem 2000 slucajnih, sa SELECT * - 2 sekunde!

Eto, obojica smo nesto naucili.

 
Odgovor na temu

erminmo

Član broj: 219981
Poruke: 82
31.185.112.*



Profil

icon Re: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)06.02.2012. u 21:14 - pre 148 meseci
e ovo je extra... sto pisete imm ja slican problem naime ja sam napravio tabelu u mysql, ustvari dvije tabele
jedna se zove UNOS a druga ISPIS.

u unos ja runo unosim brojeve od 6 brojeva ovako npr:

key brojevi
1 1.15.25.33.5.46
2 2.3.4.9.10.25
3 5.9.10.11.13.15
4 6.8.9.14.18.19
5 33.34.46.16.42.22


e sad u ispisu imam 5000 kombinacija sa 35 brojeva u redu


key brojevi
1 3.5.4.47.48.35.33.11.10.12.25.24.26.24.12.23.26.13.14.15.16.13.12.18.20.25.26.27.28.26.29.27.25.29.24
2 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.22.21.23.24.26.27.28.29.30.31.32.34.33.35.40

e sad mene interesuje kako od ovog unosa brojeva da on izbaci red od 35 brojeva gdje nedostaje samo jedan broj znaci cilj je da izbaci npr 35 brojeva ali da ne izbaci samo jedan evo primjer kao sto sam naveo u unosu da nadje red gdje imaju brojevi
1.15.25.33.5 a da nema npr. 46 i da izbaci te brojeve..
 
Odgovor na temu

[es] :: Access :: Access: Izbor slucajnog uzorka - random samples in Access (+ SQL Server)

[ Pregleda: 3429 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

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