Median Employee Salary

hard database sql window function

Problem

From Employee(Id, Company, Salary), return the median salary row of every company.

Inputrows = [(1,'A',2341),(2,'A',341),(3,'A',15),(4,'A',15314),(5,'A',451),(6,'A',513),(7,'B',15),(8,'B',13),(9,'B',1154),(10,'B',1345),(11,'B',1221),(12,'B',234),(13,'C',2345),(14,'C',2645),(15,'C',2645),(16,'C',2652),(17,'C',65)]
Outputmedian rows per company
Group by company; sort by salary; pick middle rank(s).

SELECT Id, Company, Salary FROM (
  SELECT Id, Company, Salary,
         ROW_NUMBER() OVER (PARTITION BY Company ORDER BY Salary) AS r,
         COUNT(*) OVER (PARTITION BY Company) AS n
  FROM Employee
) t
WHERE r BETWEEN n/2 + (n%2=1) AND n/2 + 1;
Time: O(N log N) Space: O(N)