Databázy - cvičenie - 5. týždeň

Created: 2008-10-15 - 17:17


use poliklinika
go

select * from pacienti order by mesPrijem desc

-- A a) Najdite najmensi mesacny prijem
select min(mesPrijem) from pacienti
--bez pouzitia min
select mesPrijem from pacienti 
	where mesPrijem <= ALL
		(Select mesPrijem from pacienti 
			where mesPrijem is not null)
--alebo cez top
select top(1) mesPrijem from pacienti
	where mesPrijem is not null 
order by mesPrijem asc

-- b) vypiste aj krstne meno
select krstne, mesPrijem from pacienti
	where mesPrijem = (select min(mesPrijem) from pacienti)
--bez pouzitia min
select mesPrijem,krstne from pacienti 
	where mesPrijem <= ALL
		(Select mesPrijem from pacienti 
			where mesPrijem is not null)
--alebo cez top
select top(1) mesPrijem, krstne from pacienti
	where mesPrijem is not null 
order by mesPrijem asc

-- c) zistite druhy najmensi prijem (pomocou min)
select min(mesPrijem) from pacienti
	where mesPrijem > (select min(mesPrijem) from pacienti)

-- d) to iste co c) + zistite krstne
select krstne, mesPrijem from pacienti 
where mesPrijem = (select min(mesPrijem) from pacienti
	where mesPrijem > (select min(mesPrijem) from pacienti))

-- e) to iste co d) len treti minimalny prijem
select krstne, mesPrijem from pacienti 
	where mesPrijem = (select min(mesPrijem) from pacienti
		where mesPrijem > (select min(mesPrijem) from pacienti
			where mesPrijem > (select min(mesPrijem) from pacienti)))

-- f) to co e) len bez pouzitia min -- toto nejde
select mesPrijem,krstne from pacienti
where mesPrijem >= ALL 
(select mesPrijem from pacienti 
	where mesPrijem > ALL
		(Select mesPrijem from pacienti 
			where mesPrijem <= ALL
				(select mesPrijem from pacienti 
					where mesPrijem is not null)))

-- ideme cez novu funkciu RANK()
select p2.krstne, p2.mesPrijem from
	(select p1.krstne, p1.mesPrijem, 
		Rank() over(order by p1.mesPrijem ASC) as poradie
		from pacienti p1
		where p1.mesPrijem is not null
	)p2
where p2.poradie = 1 -- ak pridame: and p2.mesPrijem is not null; pise bludy

-- B a)usporiadajte pacientov podla mesPrijem a vypiste aj poradia:

select p2.idP,p2.krstne,p2.mesPrijem,
	(select count(*) from pacienti p1
		where p1.mesPrijem <= p2.mesPrijem)
	from pacienti p2
order by p2.mesPrijem -- pre kazdy riadok spocita pocet tych co ma mensi plat

--b) alebo pomocou rank()
select p.idP, p.krstne, p.mesPrijem,
	rank() over(order by p.mesPrijem asc) as poradie
from pacienti p
order by p.mesPrijem -- ale toto sa nevysporiadalo s null hodnotami... takze napr.:

--c) alebo bez null a cez row_number()
select p1.krstne,p1.idP,p1.mesPrijem,
	row_number() over(order by mesPrijem) 
from pacienti p1
where p1.mesPrijem is not null

--d) alebo bez null a cez row_number()
select p1.krstne,p1.idP,p1.mesPrijem,
	dense_rank() over(order by mesPrijem) 
from pacienti p1
where p1.mesPrijem is not null

--e) pozrime sa aj co robi ntile(i)
select p1.krstne,p1.idP,p1.mesPrijem,
	ntile(5) over(order by mesPrijem) 
from pacienti p1
where p1.mesPrijem is not null --cize na i-skupin(y)