II kolokvijum 2015/2016

Postavku i bazu možete preuzeti ovde.

/*
	Resenje redovnog kolokvijuma 2015-2016
*/


use socialNetwork


-- 1. zadatak


--I nacin


select max(p.datumObjave)
from Post p join tipPosta tp 
	on p.idTipa = tp.idTipa 
		and tp.tip = 'slika'

-- II nacin


select max(datumObjave)
from post
where idTipa in (
					select idTipa
					from tipPosta
					where tip like 'slika'
				)

-- 2. zadatak


-- I nacin

select k.ime, COUNT(p.idKorisnika2) 
						as brojPrijatelja
from Korisnik k join Prijatelji p 
	on k.id = p.idKorisnika1
group by k.ime, k.id

						
--II nacin

select k.ime , ( 
					select count(*)
					from Prijatelji p
					where k.id = p.idKorisnika1
				) as broj_prijatelja
from Korisnik k

-- 3. zadatak


-- I nacin


select ime
from Korisnik
where id in (
				select distinct idKorisnika1
				from Prijatelji
				where DATEPART(MONTH,getdate()) 
					= DATEPART(month,datum)
			)

-- II nacin


select k.ime
from korisnik k
where exists ( 
				select *
				from prijatelji p
				where p.idkorisnika1=k.id 
					and datepart(month,p.datum)
						= datepart(month,getdate()) 
			  )

-- 4. zadatak


-- I nacin


-- I nacin


--ukupan broj slika po korisniku

create view broj_slika_po_korisniku as
select idVlasnika, count(*) as 'brojSlika'
from post p join tipPosta tp on p.idTipa = tp.idTipa
where tp.tip like 'slika'
group by idVlasnika

--ukupan broj lajkova na svim slikama po korisniku

create view ukupan_broj_lajkova_slika_po_korisniku as
select idVlasnika as 'idVlasnika', 
			count(*) as 'brojLajkova'
from lajk l join post p on l.idPosta = p.id 
	join tipPosta tp on p.idTipa = tp.idTipa
where tp.Tip like 'slika'
group by idVlasnika


select bs1.idVlasnika, brojLajkova*1.0/brojSlika ProsekLajkova
from broj_slika_po_korisniku bs1 
	join ukupan_broj_lajkova_slika_po_korisniku bl1
		on bs1.idVlasnika = bl1.idVlasnika
where brojLajkova*1.0/brojSlika >= 3


-- II naci


/*
	Za svaku postovanu sliku nekog korisnika izracunaj
	koliko je dobio lajkova za nju.

*/

create view LajkoviPoSlici as
select p.idvlasnika, l.idposta,count(*) BrLajkova
from post p join tipposta tp on p.idtipa=tp.idtipa and tp.tip like 'slika'
			join lajk l on l.idposta=p.id
group by p.idvlasnika, l.idposta


/*
	Za svakog korisnika izracunaj koliko ima ukupno lajkova i to podeli sa
	brojem slika, a to je ekvivalentno trazenju srednje vrednosti broja lajkova
	za sve njegove slike.
*/

select idvlasnika,avg(brlajkova * 1.0) 'ProsekLajkova'
from LajkoviPoSlici
group by idvlasnika
having avg(brlajkova * 1.0) > 3




-- 5. zadatak


--jedna osoba spojena sa svim svojim prijateljima i svim prijateljima svojih prijatelja

create view prijateljiPrijatelja as
select 	p1.idKorisnika1 as 'osoba',
		p1.idKorisnika2 as 'prijatelji',
		p2.idKorisnika2 as 'prijatelji prijatelja'
from Prijatelji p1 join Prijatelji p2 
	on p1.idKorisnika2 = p2.idKorisnika1 
		and p1.idKorisnika1 != p2.idKorisnika2


select osoba, count([prijatelji prijatelja]) 
			as 'brojPotencijalnihPrijatelja'
from prijateljiPrijatelja p1 left join prijatelji p 
		on p1.osoba = p.idKorisnika1 
				and p1.[prijatelji prijatelja] = p.idKorisnika2
where p.idKorisnika1 is null
group by osoba


--6. zadatak


create view sest1 as
select p1.idKorisnika1 as 'kor1', p2.idKorisnika1 as 'kor2', count(*) as 'brojZajednickihPrijatelja'
from Prijatelji p1 join Prijatelji p2 on p1.idKorisnika1 != p2.idKorisnika1 
	and p1.idKorisnika2 = p2.idKorisnika2
group by p1.idKorisnika1,p2.idKorisnika1

create view sest2 as
select s.kor1,s.kor2,s.brojZajednickihPrijatelja
from sest1 s left join Prijatelji p 
	on s.kor1 = p.idKorisnika1 
		and s.kor2 = p.idKorisnika2
where p.idKorisnika1 is null

select s2_1.*
from sest2 s2_1 left join sest2 s2_2 on s2_1.kor1 = s2_2.kor1 
	and s2_1.kor2 != s2_2.kor2 
	and s2_1.brojZajednickihPrijatelja < s2_2.brojZajednickihPrijatelja
where s2_2.kor1 is null



--7. zadatak


create view sedmi1 as
select idVlasnika, p.id, count(*) as 'brojLajkovaPoPostu'
from post p join lajk l on p.id = l.idPosta
where DATEDIFF(DAY,p.datumObjave,getdate())<=(365*3+30)
group by idVlasnika, p.id

create view sedmi2 as
select idVlasnika, p.id, count(*) as 'brojLajkovaPoPostu'
from post p join lajk l on p.id = l.idPosta
where DATEDIFF(DAY,p.datumObjave,getdate())>(365*3+30)
group by idVlasnika, p.id

create view sedmi3 as
select idVlasnika, avg(brojLajkovaPoPostu*1.0) as 'prosek'
from sedmi1
group by idVlasnika

create view sedmi4 as
select idVlasnika, avg(brojLajkovaPoPostu*1.0) as 'prosek'
from sedmi2
group by idVlasnika

select case when s3.idVlasnika is null then s4.idVlasnika else s3.idVlasnika end as 'idVlasnika', 
						case when s3.prosek > s4.prosek then 'raste'
						when s3.prosek <= s4.prosek then 'opada'
						when s3.prosek is null then 'opada'	
						when s4.prosek is null then 'raste' end as 'popularnost'
from sedmi3 s3 full outer join sedmi4 s4 on s3.idVlasnika = s4.idVlasnika