https://www.youtube.com/watch?v=kJc1aK00vwg&list=PLavw5C92dz9Hxz0YhttDniNgKejQlPoAn&index=20

-- Find the median ages of countries
drop table if exists people;
create table people
(
	id			int,
	country		varchar(20),
	age			int
);
insert into people values(1 ,'Poland',10 );
insert into people values(2 ,'Poland',5  );
insert into people values(3 ,'Poland',34   );
insert into people values(4 ,'Poland',56);
insert into people values(5 ,'Poland',45  );
insert into people values(6 ,'Poland',60  );
insert into people values(7 ,'India',18   );
insert into people values(8 ,'India',15   );
insert into people values(9 ,'India',33 );
insert into people values(10,'India',38 );
insert into people values(11,'India',40 );
insert into people values(12,'India',50  );
insert into people values(13,'USA',20 );
insert into people values(14,'USA',23 );
insert into people values(15,'USA',32 );
insert into people values(16,'USA',54 );
insert into people values(17,'USA',55  );
insert into people values(18,'Japan',65  );
insert into people values(19,'Japan',6  );
insert into people values(20,'Japan',58  );
insert into people values(21,'Germany',54  );
insert into people values(22,'Germany',6  );
insert into people values(23,'Malaysia',44  );

select * from people;

Pasted image 20241119174740.png

ROW_NUMBER()
Window Frame

SELECT country,age
FROM (
select *
,ROW_NUMBER() OVER (PARTITION BY country ORDER BY age) AS age_rn,
COUNT(id) OVER (PARTITION BY country ORDER BY age RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS total_people
from people) x

WHERE age_rn >= total_people/2 AND age_rn <= (total_people/2) + 1