Szkolenie SQL Kraków dzień 3 A

select left(imie,1), imie, len(imie)
from zawodnicy

select imie, wzrost , rank() over (order by wzrost)
from zawodnicy

select imie, wzrost , dense_rank() over (order by wzrost)
from zawodnicy

select imie, wzrost , ntile(3) over (order by wzrost)
from zawodnicy

select imie, wzrost , lag(imie,2) over (order by wzrost)
from zawodnicy

select imie, wzrost , lead(imie,2) over (order by wzrost)
from zawodnicy

select imie, wzrost , max(wzrost) over (order by wzrost)
from zawodnicy

select imie, wzrost , kraj,
 avg(wzrost) over (order by wzrost
	 rows between 2 preceding  and 2 following)
from zawodnicy
 
 select imie, wzrost , kraj,
 count(wzrost) over (partition by kraj order by wzrost
  rows between 2 preceding and unbounded following  )
from zawodnicy

 
 select imie, wzrost , kraj,
 count(wzrost) over (order by wzrost
  rows between unbounded preceding and unbounded following  )
from zawodnicy

  --1) dla kazdego zawodnika wypisz o ile rozni sie jego wzrost od wzrostu 
-- zawodnika od niego nizszego (wzgledem uporzadkowania po wzroscie )

-- rang, dense_rank, lead, lag, ntile, first_value, last_value, 
-- sum, max, avg, count, .. .. 

select imie,wzrost,  wzrost - lag(wzrost,1) over (order by wzrost)
from zawodnicy
order by wzrost

-- 2 ) dla kazdego zawodnika wypisz roznice o ile rozni sie jego wzrost 
  -- od sredniego wzrostu zawodnikow z jego kraju 
  
  select imie, wzrost,kraj,wzrost - avg(convert(decimal, wzrost)) over 
	(partition by kraj order by wzrost  rows between unbounded preceding and unbounded following)
  from zawodnicy


 --3) dla kazdego zawodnika wypisz nazwisko zawodnika od niego wyzszego, z jego kraju 
     -- wzgledem uporzadkowania po wzroscie 

	 select imie,nazwisko, kraj,wzrost, LEAD(nazwisko,1) over 
		(partition by kraj order by wzrost)
	 from zawodnicy


  --4) dla kazdego zawodnika wypisz imie zawodnika najwyzszego z jego kraju, 
     -- podpowiedz: zastosuj funkcje okienkową last_value(imie)
	 
	 select imie, nazwisko, kraj, wzrost, LAST_VALUE(nazwisko) over
		(partition by kraj order by wzrost 
		  rows between current row and unbounded following)
	 from zawodnicy
	 order by kraj,wzrost 

	-- 5) wypisz zawodnikow, ktorych wzrost jest drugi co do wielkosci 	

	select * from 
		(select imie, nazwisko, wzrost , dense_rank() over (order by wzrost desc) r
		from zawodnicy
		) t 
	 where r=2
	 order by wzrost desc
 

-- dla kazdego zawodnika wypisz połowę roku, w której się urodził
	-- (I polowa lub II polowa ) 

	select kraj, p , avg(wzrost)
		from
		(select imie, nazwisko, kraj, data_ur, WZROST,
			iif(month(data_ur) <7,'I polowa','II polowa') p  
		from zawodnicy) t 
	group by kraj, p

	select *
	from
	    (select kraj, WZROST,
			iif(month(data_ur) <7,'I polowa','II polowa') p  
		from zawodnicy) t 
     pivot 
	  (
		avg(wzrost)
		for p in ([I polowa],[II polowa])
	  ) pvt


	  -- zrób zestawienie, które wysietli ile razda z ekip zawodnikow skakala w 
	  -- danym mieście
		-- jako nagłówiki wierszy będą nazwiska zawodników
		-- jako nagłówki kolumn będą nazwy miast
		-- na przecięciu liczba startów 
 
	select * from
		(select kraj, nazwa_miasta, COUNT(*) starty
		from zawodnicy z left join uczestnictwa u on z.id_zawodnika = u.id_zawodnika
				left join zawody w on w.id_zawodow = u.id_zawodow
				left join skocznie s on s.id_skoczni = w.id_skoczni
				left join miasta m on m.id_miasta = s.id_miasta
		group by kraj, nazwa_miasta) q
	pivot 
	(
		sum(starty)
		for nazwa_miasta in (["Lahti"],["Oberstdorf"],["Zakopane"])
	) p