[ roberto555 @ 11.12.2006. 13:47 ] @
pozdrav,
ne znam dal postoji uopće ovo što mislim, select top n ..... vrača prvih n zapisa iz rezultata, dal postoji da dobijem recimo od - do zapisa?? kako je tu prvih 100 npr. da dobijem recimo od 50-100, a ako slučajno nema toliko da onda nije ništa,,,ili tako nešto, samo tako pitam budući da nisam sig.dal to uopće postoji!!!?

hvala!

[ Zidar @ 11.12.2006. 14:13 ] @
Naravno da moze, ali nije trivijalno. Prvo, tabela iz koj izvlacis redove mora biti takva da se redovi mogu sortitrati po nekoj kolni ili kobinaciji kolona. Posao onda radis u dva koraka. Prvi korak jeste da sortiras tabelu kako zelis i da za svaki red izracunas njegovu poziciju u tom sortu. To se postize upotrebom correlated subqueries. Drugi korak: nad tim datasetu koji je sortiran i ima izracunat redosled jednostavno odradis

SELECT .. FROM <Sortirani dataset> WHERE Redosled BETWEEN a NAD b

Gde je trik? U correlated subquery, a to verujem ima u knjigama negde. Dalje, u prvom koraku kreiras neki SELECT statemet koji ti izracunava redosled. On ti treba u drugom koraku. Negde moras da ga cuvas u medjuvremenu. Ili ces ga casuvati kao view, ili ces ga koristiti kao deo finalnog SELECta. Drugi nacin daje veliki i za pocetnika nepregledan select tipa

SELECT FROM A (SELCT FROM B (SELECT FROM C))

Verzijaj MS SQL 2005 cini mi se ima i nesto sto se zove RANK i moglo bi da resi problem, pa proveri i to, mozda moze.
[ Fedya @ 11.12.2006. 14:42 ] @
Moram da priznam da nisam bas najbolje shvatio ovo Zidarevo resenje.

Jednom sam imao slican problem i resio sam ga preko privremene tabele koja ima IDENTITY kolonu i posle cupam vrednosti izmedju.
[ roberto555 @ 11.12.2006. 15:11 ] @
Code:

WITH os AS (SELECT     ID, ime, prezime, grupa, ROW_NUMBER() OVER (ORDER BY id) AS RowNumber
FROM         osoba)
    SELECT     *
     FROM         os
     WHERE     RowNumber BETWEEN 5 AND 10;


eto probao sam, osoba je neka tabela bezvezna sa kolonama (id,ime,prezime i grupa), i radi dobro ovo, no dobro si rekao ima i RANK() no nisam skužio još kako da proradi, ima i NTILE () , umjesto ROW_NUMBER() ,čemu služi PARTITION BY ?? (nema ga ovdje al našao sam nekih pr.gdje se koristi), i ako može netko detaljnije pojasniti OVER? našao sam primjera gdje se koristi uz neke funkcije (sum,avg count,min max....)
[ Fedya @ 11.12.2006. 15:30 ] @
Citat:
roberto555: čemu služi PARTITION BY ?? (nema ga ovdje al našao sam nekih pr.gdje se koristi), i ako može netko detaljnije pojasniti OVER? našao sam primjera gdje se koristi uz neke funkcije (sum,avg count,min max....)


Partition By sluzi za definisanje particija jako velikih tabela (npr. da bi se ostvario paging kod web aplikacija), kada se zbog velicine ne moze vratiti cela tabela vec samo odredjeni broj zapisa.

Sto se OVER-a tice, nisam se jos sreo sa tom kljucnom recju. Mozes li dati primer gde se koristi?

sto se resenja tice sto ne probas:
create table #temp (redniBroj int identity, [tvoje kolone ukljucujuci id])

insert into #temp
select id, prezime... from osoba

select id, prezime... from #temp where redniBroj between 5 and 10

drop table #temp


??
[ roberto555 @ 11.12.2006. 15:48 ] @
Code:
USE AdventureWorks;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO


eto primjer iz helpa za OVER, skužio sam šta je part.by sad, ma napravit ću eto sad s tvojim imam već dva načina (nije problem više), no nije mi sad samo da to napravim, htio bih usput skužit što znači tj što radi koja klauzula, da znam za ubuduće kad mi negdje zatreba nešto takvo,(ne volim da mi netko nešto narpavi pa ja samo copy...) tj da na kraju ne znam ni kako radi!

-danas sam napravio "test", tj upisao sam oko 60 000 stavaka u bazu, i kad sam probao program koji radi u jednom djelu traženje baze al na event text_changed dolazi do "trzaja", jer pretpostavljate vadim sve iz baze, pa ću sad to ograničiti na 500 zapisa recimo sa top u select upitu, no kad se želi recimo prikazati sve da nebi bilo da program smrzne dok vadi sve iz baze, imam jednu ideju koja onda zahtjeva ovo što sam na početku pitao! iako i 60 000 zapisa i nije tako puno jako budući da se koristeći program može upisati 999 999, al dosad nisam isprobavao kako radi kad ima više zapisa, pa eto sad ću to doraditi! može i neki savjet vezan uz ovo?!?! ako je netko imao sličnih "problemčića"...